LeetCode 19 删除链表的倒数第N个节点

链接: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;
            
    }
};
原文地址:https://www.cnblogs.com/hellosnow/p/11557277.html