一、 題目
給定一個單鏈表,刪除倒數第n個節點,返回刪除了的鏈表。
例如: 已知: 1->2->3->4->5, n = 2.
處理後:1->2->3->5.
試着遍歷一次完成。
二、 分析
看到這道題我第一感覺就是雙指針,因爲要刪除倒數第n個數,所以兩個指針的間距也就是這個n,當右邊的指針到達末尾處時,那麼左指針的下一個指針就是要刪除的節點。其實會有下面幾種特殊情況:
1、{1,2},n=1;
2、{1,2},n=2;
3、{},0
當然,有人可能會說n可不可以大於節點數,不過這個題目已經限制了n是有效的。
擴展:1、n的值不限制
2、鏈表不限於單鏈表,求刪除離頭節點倒數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) {
if(head==NULL||head->next==NULL) return NULL;
ListNode *Rnode = head;
ListNode *Lnode = head;
for(int i=1; i<=n; i++){
Rnode = Rnode->next;
}
if(Rnode==NULL){
head = head->next;
return head;
}
while(Rnode->next!=NULL){
Lnode = Lnode->next;
Rnode = Rnode->next;
}
Lnode->next = Lnode->next->next;
return head;
}
};