leetcode19删除链表倒数第n个结点
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
我们仍然采用快慢指针进行解决。
以及虚拟头节点。
struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
struct ListNode *p = (struct ListNode *)malloc(sizeof(struct ListNode));
p->next = head;//这里我们设置虚拟头结点
struct ListNode *pr=head,*temp = p;//temp用来存最初的虚拟头节点
while(n--) pr = pr->next;//这里我们先让pr走n步,此时p与pr距离为p
while(pr != NULL)//接下来我们让pr与p一起走,当pr为空时,p与pr的距离
//仍然为n,p所指的结点就是我们要删除的前一个结点位置。
{
p = p->next;
pr = pr->next;
}
p->next = p->next->next;//删除结点基本操作
return temp->next;//这里我们返回虚拟头结点的下一个结点,
//也就是temp的作用。此处我们绝不能返回head
//因为我们需要考虑删除头结点的情况,head被删除了就没了,
//所以返回虚拟头结点所指的下一个绝对没毛病!
}