19. 刪除鏈表的倒數第N個節點c++

給定一個鏈表,刪除鏈表的倒數第 個節點,並且返回鏈表的頭結點。

示例:

給定一個鏈表: 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;
        }
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章