leetcode 19. 删除链表的倒数第N个节点
19. 删除链表的倒数第N个节点
问题描述
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
问题分析
这是一道关于双指针的典型应用,先让快指针跑n步,接着让快指针和慢指针一起跑,然后删除相应的元素即可,只不过要注意要删除的元素是哪个。另外刚开始我直接在head上开始做,结果在链表只有一个元素和两个元素上出错了,需要加一些判定条件,看了大神们的解答,另一个新的节点的下一个节点指向head,则只需要考虑节点只有一个的情形就行了,即下面代码中的if(fast == NULL)return head->next;因为如果跑n步fast节点到头了,说明要删除的就是开头的节点。
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *tmp = new ListNode(0);
tmp->next = head;//保证了要搜索的链表至少有一个元素
ListNode *fast = tmp,*slow = tmp;
while(n > -1 && fast != NULL)
{
fast = fast->next;
--n;
}
if(fast == NULL)return head->next;
while(fast != NULL)
{
fast = fast->next;
slow = slow->next;
}
slow->next = slow->next->next;
delete tmp;
return head;
}
};