给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
1.原创
struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
int total,time;
struct ListNode* tmp;
tmp=head;
for(total=1;tmp->next!=NULL;tmp=tmp->next,total++);
total=total-n;
if(total==0)
tmp=head->next;
else if(total>0){
tmp=head;
for(time=1;time!=total;time++){
tmp=tmp->next;
}
tmp->next=tmp->next->next;
tmp=head;
}
else
tmp=NULL;
return tmp;
}
2.看评论用的递归:
class Solution {
public:
int cur=0;
ListNode* removeNthFromEnd(ListNode* head, int n) {
if(!head) return NULL;
head->next = removeNthFromEnd(head->next,n);
cur++;
if(n==cur) return head->next;
return head;
}
};
递归主要是寻找到要删除的结点n,在将结点next赋值next->next.
3.看评论用的快慢指针
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
if(!head | !head -> next) return NULL;
ListNode * fast = head, *slow = head;
for(int i = 0; i < n; i++){
fast = fast -> next;
}
if(!fast){
return head -> next;
}
while(fast -> next){
fast = fast -> next;
slow = slow -> next;
}
slow -> next = slow -> next -> next;
return head;
}
};
快慢指针用的思想是n+m=p则m=p-n。先将快指针正向走n步再将快慢一起走下剩余的部分,当快指针走完时慢指针走向了要删除的部分,注意一点是快指针必须要从指向的下一个位置开始计数,这样慢指针的next才能指向指向要删除的位置才可以删除