算法挑战2: 删除链表的倒数第N个节点

3 阅读1分钟

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

这道题是leecode hot100的第19题

难度: 中等

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

思路分析:

链表题,有点儿意思,是寻找倒数的第N个结点,因为链表的长度是不确定的

我们可以使用双指针,先让快指针走N步,这样就可以找到应被删结点的前一个节点

让快慢指针同时走, 直到快指针走到节点末尾

这时慢指针指的就是被删结点的前一个节点

题解语言: js

题解:

var removeNthFromEnd = function (head, n) {
    //虚拟头节点,常规操作,方便后续操作
    const dummy = new ListNode(0);
    dummy.next = head;
    
    // 快慢指针
    // 先让一快指针先走n步
    let fast = dummy;
    let slow = dummy;
    
    //先让快指针先走n步
    for(let i = 0; i <= n; i++){
        fast = fast.next;
    }
    //两个指针同时走,直到快指针走到末尾
    while(fast !== null){
        fast = fast.next;
        slow = slow.next;
    }

    // 删除节点
    slow.next = slow.next.next;

    return dummy.next;

};

其实我一开始想的是先翻转

翻转过来之后的倒数第N个结点就变成了第N个结点

让我删除第n个节点就可以

但是不好解决一些边界问题,比如链表只有一个节点时

这样虽然可行吧,但是不太优雅,不如快慢指针,而且需要翻转两次每次反转都相当遍历一次链表,复杂度太高

加油