19.刪除鏈表中倒數第n個結點

一、題目:

19.刪除鏈表中倒數第n個結點

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

示例:

給定一個鏈表: 1->2->3->4->5, 和 n = 2.

當刪除了倒數第二個節點後,鏈表變爲 1->2->3->5.

二、思路:

首先遍歷一遍鏈表,獲得鏈表長度length。再遍歷第二次鏈表,採用cnt計數,當cnt=length-n時,刪除當前指向的下一個結點。

三、代碼(C++):

    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode *p=head;
        ListNode *q=head;
        int length=0;
        int cnt=0;
        while(p)
        {
            ++length;
            p=p->next;
        }
        if(length==n)
        {
            head=head->next;
            return head;
        }
        while(q)
        { 
            ++cnt;
            if(cnt==length-n)
            {
                q->next=q->next->next;
                break;
            }
            q=q->next;
        }
        return head;
    }

四、擴展:只遍歷一次鏈表

首先用一個指針向前走n+1個位置,然後讓第二個指針和第一個一起向後遍歷,直到第一個指針爲空。刪除第二個指針指向的下一個結點。

ListNode* removeNthFromEnd(ListNode* head, int n) {
         ListNode *h=new ListNode(0);
        h->next=head;
        head=h;
        ListNode *p=h,*q=h;
        for(int i=1;i!=n+2;i++)
        {
            p=p->next;
        }
        while(p)
        {
            q=q->next;
            p=p->next;
        }
        q->next=q->next->next;
        return head->next;
    }

 

 

 

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