19. 删除链表的倒数第N个节点
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
解题思路
1.使用快慢指针,让快指针先走 k 步,然后快慢指针开始同速前进。这样当快指针走到链表末尾 null 时,慢指针所在的位置就是倒数第 k 个链表节点。
2.要注意可能会删除头结点,若是删除头结点,此时fast指针指向了NULL,所以可以增加fast==NULL这个条件,而满足条件时需要返回head->next。
实现代码
struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
struct ListNode *fast,*slow;
fast = slow = head; //让快指针先走 n 步,然后快慢指针开始同速前进。当快指针指向null 时,慢指针所在的位置就是倒数第n个链表节点
while(--n>=0) //先减减,让快指针先走n步
{
fast = fast->next;
}
if(fast==NULL) //判断倒数第N个节点是不是头结点,要是头结点就时删除了头结点则返回头结点的next
{
return head->next;
}
while(fast->next!=NULL) //当快指针的next不指向null时,快慢指针同时同速向后,因为要删除倒数第n个节点,所以慢指针要指向倒数第n+1个节点的位置
{
fast = fast->next;
slow = slow->next;
}
slow->next = slow->next->next; //因为要删除第n个位置节点,所以slow指向的是第n+1个节点的位置
return head;
}