給定一個鏈表,刪除鏈表的倒數第 n 個節點,並且返回鏈表的頭結點。
示例:
給定一個鏈表: 1->2->3->4->5, 和 n = 2.
當刪除了倒數第二個節點後,鏈表變爲 1->2->3->5.
說明:
給定的 n 保證是有效的。
進階:
你能嘗試使用一趟掃描實現嗎?
允許反饋(兩趟掃描)就是計數,不多贅述
一趟掃描:雙指針法:先來個先驅指針pioneer pt1,從head起走上n步,再從頭來個指針pt2和他一塊走,走到pt1->next==NULL,這樣兩個指針中間查了n-1個節點,要刪除的就是pt1->next節點,用pt1->next=pt1->next->next,但是但是但是!!!如果我pioneer走n步就tm走到NULL了怎麼辦,想想沒毛病,n是鏈表長度的話,就是刪除頭節點,就沒法用pt1->next判決循環條件了,並且刪除的也是*pt2而不是*(pt2->next),我們就在循環開始加個判斷pt1是不是NULL,如果NULL,return個head->next就完事了。
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode*pt1=head,*pt2=head;
for(int i=0;i<n;i++)pt1=pt1->next;
if(pt1==NULL) return pt2->next;
else{
while(pt1->next!=NULL){
pt1=pt1->next;
pt2=pt2->next;
}
pt2->next=pt2->next->next;
return head;
}
}
};