1. 程式人生 > >刪除鏈表的倒數第N個節點---簡單

刪除鏈表的倒數第N個節點---簡單

distance nullptr spa 進階 let rom val 復雜度 style

題目:

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

示例:

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

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

思路:

  淺顯的思路就是遍歷一遍取長度,然後再遍歷一遍找到位置刪除,然而這裏要遍歷兩次,雖然時間復雜度為O(n)。進階的想法是使用雙指針,對的,又是雙指針,只要保證兩個指針的間隔為n,之後讓前一個指針一直到末尾,兩個指針同時遞增,就可以保證後一個指針是倒數第n的位置,需要註意的是幾種臨界的判斷,自己試著想一下吧。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 
*/ class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { auto p=head,q=head; int distance=0; while(n) { p=p->next; n--; } ListNode* prev=nullptr; while(p) { if(p->next==nullptr) { prev
=q; } p=p->next; q=q->next; } if(q==head) { auto r=q->next; q->next=nullptr; delete q; return r; } prev->next=q->next; delete q; return head; } };

刪除鏈表的倒數第N個節點---簡單