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

题目

给定一个链表,删除链表的倒数第 个节点,并且返回链表的头结点。

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.

说明:

给定的 n 保证是有效的。

进阶:

你能尝试使用一趟扫描实现吗?

思想

使用两个指针,第一个指针从列表的开头向前移动n + 1 个节点, 而第二个指针从列表的开头出发

现在,这两个指针被 n 个节点分开.

同时移动两个指针来保持这个间隔,每次向前移动一个,直到第一个指针到达最后一个节点的下个节点指向null或者nil, 此时第二个指针将指向从最后一个节点起的第 n 个节点

然后第二个指针的next指向next->next节点即可

 代码

public ListNode removeNthFromEnd(ListNode head, int n) {
    ListNode dummy = new ListNode(0);
    dummy.next = head;
    ListNode first = dummy;
    ListNode second = dummy;
    // Advances first pointer so that the gap between first and second is n nodes apart
    for (int i = 1; i <= n + 1; i++) {
        first = first.next;
    }
    // Move first to the end, maintaining the gap
    while (first != null) {
        first = first.next;
        second = second.next;
    }
    second.next = second.next.next;
    return dummy.next;
}
原文地址:https://www.cnblogs.com/guohai-stronger/p/12009972.html