leetCode:19. 删除链表的倒数第 N 个结点

108 阅读1分钟

题目

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

解题思路

设定虚拟节点和两个指针(快慢指针,亦或是前后指针),让快指针先走,当走到距离慢指针n个节点时停下,然后快慢指针一起走, 当快指针为空节点时停下,此时:慢指针的下一个节点就是要删除的节点;最后将慢指针的下一个节点指向删除节点的下一个节点即可

/**
 * @param {ListNode} head
 * @param {number} n
 * @return {ListNode}
 */
var removeNthFromEnd = function(head, n) {
    // 设置虚拟头节点和快慢节点
    const vr_node = new ListNode(0);
    vr_node.next = head;
    let slow = vr_node;
    let fast = vr_node;

    //让快节点走到距离开始位置为n个时停止
    for(let i = 0; i <= n; i++) {
        fast = fast.next;
    }

    // 快慢一起走,直到快指针为null
    while(fast) {
        fast = fast.next;
        slow = slow.next;
    }
    
    // 此时慢指针所在位置的next节点即为要删除节点,最后一步:慢指针跳过要删除的节点
    slow.next = slow.next.next;
    return vr_node.next;
};