在單鏈表和雙鏈表中刪除倒數第K個節點

2022-04-06 00:07:43 字數 2533 閱讀 7618

【說明】:

本文是左程雲老師所著的《程式設計師面試**指南》第二章中「在單鏈表和雙鏈表中刪除倒數第k個節點」這一題目的c++復現。

感謝左程雲老師的支援。

【題目】:

分別實現兩個函式,乙個可以刪除單鏈表中倒數第 k 個節點,另乙個可以刪除雙鏈表中倒數第 k 個節點。

【要求】:

如果鍊錶長度為 n,時間複雜度達到 o(n),額外空間複雜度達到 o(1)。

【思路】:

在確定待刪除節點的位置有乙個小技巧,大家可以看**推斷,也可以翻看左老師的原書奧。

【編譯環境】:

centos6.7(x86_64)

gcc 4.4.7

【實現】:

實現及測試**:

1/*2

*檔名:lists_dellastkth.cpp34

*摘要:刪除單鏈表或雙鏈表的倒數第 k 個節點5*/

67 #include 8

9using

namespace

std;

1011

struct

singlenode12;

1617

struct

doublenode18;

2324 singlenode* removelastkthnode(singlenode *head,int

lastkth)

2534

if(0 ==lastkth)

3540

if(0 >lastkth)

4149

return

head; 50}

5152 doublenode* removelastkthnode(doublenode *head,int

lastkth)

5362

if(0 ==lastkth)

6369

if(0 >lastkth)

7080

return

head; 81}

8283

intmain()

84106

//單鏈表

107 sptr->next = new

singlenode;

108 sptr = sptr->next;

109 sptr->value =i;

110 sptr->next =null;

111//

雙鏈表112 dptr->next = new

doublenode;

113 dptr->next->pre =dptr;

114 dptr = dptr->next;

115 dptr->value =i;

116 dptr->next =null;

117}

118int k = 5

;119 cout << "

single linked list before remove last

"<< k << "

th data:

"<

120 sptr =shead;

121while(null !=sptr)

122126 cout <

127 cout << "

double linked list before remove last

"<< k << "

th data:

"<

128 dptr =dhead;

129while(null !=dptr)

130134 cout <

135136

removelastkthnode(shead,k);

137removelastkthnode(dhead,k);

138139 sptr =shead;

140 dptr =dhead;

141 cout << "

single linked list after removed:

"<

142while(null !=sptr)

143147 cout <

148 cout << "

double linked list after removed:

"<

149while(null !=dptr)

150154 cout <

155return0;

156 }

view code

【說明】:

這個演算法不難,我寫的測試**(main 函式)較為麻煩,大家理解哈。

注:

在單鏈表和雙鏈表中刪除倒數第K個節點

分別實現兩個函式,乙個可以刪除單鏈表中倒數第k個節點,另乙個可以刪除雙鏈表中倒數第k個節點。如果鍊錶長度為n,則要時間複雜度達到o n 額外空間複雜度達到o 1 一種方法是設定快慢指標,快指標先走k步,此時慢指標從頭開始走,兩者同時開始走,當快指標走到尾時,慢指標走到倒數第k個節點,刪除當前慢指標的...

2 2在單鏈表和雙鏈表中刪除倒數第K個節點

題目 分別實現兩個函式,分別可以刪除單鏈表和雙鏈表中倒數第k個節點。思路 兩次遍歷鍊錶,第一遍每移動一步,就讓k值減1 第二遍從頭開始遍歷鍊錶,每移動一步k值加1,加到0就停止遍歷,此時移動到的節點就是要刪除節點的前乙個節點。實現class node class doublenode public ...

鍊錶 在單鏈表和雙鏈表中刪除倒數第K個節點

題目 分別實現兩個函式,乙個可以刪除單鏈表中倒數第k個節點,另乙個可以刪除雙鏈表中倒數第k個節點。要求 如果鍊錶長度為n,時間複雜度達到o n 額外空間複雜度達到o 1 解答 單鏈表 public class node public node removelastkthnode node head,...