題目描述
給定一個鏈表,刪除鏈表的倒數第 n 個節點,並且返回鏈表的頭結點。
示例:
給定一個鏈表: 1->2->3->4->5, 和 n = 2.
當刪除了倒數第二個節點后,鏈表變為 1->2->3->5.
說明:
給定的 n 保證是有效的。
進階:
你能嘗試使用一趟掃描實現嗎?
解題思路
典型的利用雙指針法解題。首先讓指針first指向頭節點,然后讓其向后移動n步,接着讓指針sec指向頭結點,並和first一起向后移動。當first的next指針為NULL時,sec即指向了要刪除節點的前一個節點,接着讓first指向的next指針指向要刪除節點的下一個節點即可。注意如果要刪除的節點是首節點,那么first向后移動結束時會為NULL,這樣加一個判斷其是否為NULL的條件,若為NULL則返回頭結點的next指針。
代碼
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode* removeNthFromEnd(ListNode* head, int n) { 12 ListNode* first=head; 13 while(n--!=0) 14 first=first->next; 15 if(!first) 16 return head->next; 17 ListNode* sec=head; 18 while(first->next!=NULL){ 19 sec=sec->next; 20 first=first->next; 21 } 22 sec->next=sec->next->next; 23 return head; 24 } 25 };