链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
链表类型的题画图来解比较清晰,对于单链表来说,删除节点的方法是找到需要删除的节点的前一个节点,将前一个节点的指针指向待删节点所指的下一个节点,即可完成删除操作。所以在这道题中,要找到倒数第n+1个节点。
在链表的删除操作中,有可能会删掉头节点,所以需要先定义一个虚拟节点,让这个虚拟节点指向头节点。
由于只进行一次扫描,可以定义两个指针,让其中一个先向前走n步,然后让两个指针同时向前走,直到第一个指针走到最末尾的节点终止。这样,第二个指针所指的节点就是倒数第n+1个节点。
找到倒数第n+1个节点之后就可以进行删除操作。最后要注意返回的是虚拟节点的下一个节点,而不是头节点。
c++代码如下:
class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { auto dummy = new ListNode(-1); dummy -> next = head; auto first = dummy, second = dummy; while(n--){ first = first -> next; } while(first -> next){ first = first -> next; second = second -> next; } second -> next = second -> next -> next; return dummy -> next; } };