解答:
自己的实现方式很朴素:对链表计数然后找到要删除的节点。
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
int count=0;
ListNode *tmp=head;
while(tmp!=NULL){//先计算一下有几个节点
tmp=tmp->next;
count++;
}
int num=count-n;//找到需要删除的节点的前一个节点是第几个
count=0;tmp=head;
if(num==0&&count!=1){//删除头节点的情况(不是只有一个节点)
head=head->next;
return head;
}
else if(num==0&&count==1) //只有一个节点且要删除头节点时,直接返回空
return NULL;
//定位节点并删除
while(count!=num-1){
tmp=tmp->next;
count++;
}
ListNode *q=tmp->next;
tmp->next=q->next;
delete q;
return head;
}
};
双指针法
学习的是题解中的双指针法,很巧妙
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *first=head;
ListNode *second=new ListNode(-1,head);//哑火节点
for(int i=0;i<n;i++)
first=first->next;//使first与second之间隔n个节点
while(first!=NULL){//first与second同步向后移动,直到first指向链表末尾NULL,此时second指向要删除的节点的前一个节点
first=first->next;
second=second->next;
}
if(second->next==head)
head=head->next;
second->next=second->next->next;
return head;
}
};