分別實現兩個函式,乙個可以刪除單鏈表中倒數第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,...