就是找倒数第N个结点,然后删除
双指针解决罢了。比较麻烦的问题在于如果删除的是最后一个结点是怎么办。我想到的记录要删除的结点的前一个结点,而且开始得判断如果是长度为1,返回null。但是还是蠢
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
if(!head->next)
return nullptr;
int i=0;
ListNode *last=head,*pre=head;
while(i<n){
++i;
last=last->next;
}
ListNode *ppre;
while(last!=nullptr){
ppre=pre;
pre=pre->next;
last=last->next;
}
if(n==1){
ppre->next=nullptr;
}
else{
//这里可以用
//ppre->next=pre;
pre->val=pre->next->val;
pre->next=pre->next->next;
}
return head;
}
};
既然多用了前一个结点,为什么不直接添加一个哑结点,然后就可以直接用前一个结点了
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *dummy=new ListNode(0,head);
int i=0;
ListNode *last=head,*pre=dummy;
while(i<n){
++i;
last=last->next;
}
while(last!=nullptr){
pre=pre->next;
last=last->next;
}
pre->next=pre->next->next;
return dummy->next;
}
};