删除链表的倒数第N个节点
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
这道题用双指针来做,一个快指针,一个慢指针还有一个联动指针用来删除节点,让快指针先走n步,然后快指针和慢指针一起动,当快指针指向空时,慢指针一定指向要删除的节点。还要判断要删除的是否是头指针。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
//typedef struct ListNdoe Node;
struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {
if(n==0) return head;
struct ListNode *fastp=head,*slow=head,*slowd=slow;
while(n--)
{
fastp=fastp->next;
}
while(fastp)
{
fastp=fastp->next;
slowd=slow;
slow=slow->next;
}
if(slow==head)
{
head=head->next;
}
else
{
slowd->next=slow->next;
free(slow);
}
return head;
}