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

2021-09-01 09:12:44 字數 1447 閱讀 4994

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

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

一種方法是設定快慢指標,快指標先走k步,此時慢指標從頭開始走,兩者同時開始走,當快指標走到尾時,慢指標走到倒數第k個節點,刪除當前慢指標的節點,(問題是要記錄前後兩個節點)單鏈表和雙鏈表兩種情況。

書中給出的方法是根據k值得變化來進行刪除操作,鍊錶從頭開始,每移動一步,k值減1,最後,若k=0:刪除頭節點;若k>0,不刪除;若k<0,當k=0時為倒數第k個節點;之後再次從頭節點開始,k每步自增1,等於0時為倒數k個節點的前乙個節點。

在雙鏈表中執行刪除操作時注意prev指標的指向問題即可,不再對雙鏈表進行測試。

以下**根據上面兩個思路均進行了測試。

#include

using

namespace std;

struct singlelist };

struct doublelist };

void

dellastksingle1

(singlelist* head,

int k)

singlelist* prev = rawhead;

while

(fast !=

null

) singlelist* pnode = slow;

prev-

>next = slow-

>next;

delete pnode;

}singlelist*

dellastksingle

(singlelist* head,

int k)

if(k ==0)

head = head-

>next;

if(k <0)

return head;

}singlelist*

createsingle

(int

* in,

int len)

p->next =

null

;return head;

}void

prints

(singlelist* head)

cout << endl;

}int

main()

;int len =5;

singlelist* heads =

createsingle

(input, len)

;int k =2;

//dellastksingle1(heads, k);

dellastksingle1

(heads, k)

;prints

(heads)

;getchar()

;return0;

}

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

說明 本文是左程雲老師所著的 程式設計師面試 指南 第二章中 在單鏈表和雙鏈表中刪除倒數第k個節點 這一題目的c 復現。感謝左程雲老師的支援。題目 分別實現兩個函式,乙個可以刪除單鏈表中倒數第 k 個節點,另乙個可以刪除雙鏈表中倒數第 k 個節點。要求 如果鍊錶長度為 n,時間複雜度達到 o n 額...

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,...