美文网首页
删除链表的倒数第 N 个结点 2022-02-26 周六

删除链表的倒数第 N 个结点 2022-02-26 周六

作者: 勇往直前888 | 来源:发表于2022-02-26 22:16 被阅读0次

    题目

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

    示例:
    输入:head = [1,2,3,4,5], n = 2
    输出:[1,2,3,5]

    力扣官网解法

    思路

    • 判空,一般直接返回空;

    • dummy节点:
      在head的前面增加一个dummy节点,辅助操作

    • 快慢指针:
      快指针指向head;慢指针指向dummy;==== 一开始就错开一步

    • 移动快指针n次

    • 一起移动,直到快指针结束

    • 删除慢指针的下一个节点

    • 返回dummy.next

    其他思路:先用一个指针遍历一遍求出链表的元素个数size
    然后删除第size-n+1个元素就好了

    JS代码

    /**
     * Definition for singly-linked list.
     * function ListNode(val, next) {
     *     this.val = (val===undefined ? 0 : val)
     *     this.next = (next===undefined ? null : next)
     * }
     */
    /**
     * @param {ListNode} head
     * @param {number} n
     * @return {ListNode}
     */
    var removeNthFromEnd = function(head, n) {
        // 判空
        if (head == null) {
            return null;
        }
    
        // 增加一个dummy节点
        let dummy = new ListNode();
        dummy.val = 0;
        dummy.next = head;
    
        // 快慢指针
        let quick = head;
        let slow = dummy;
    
        // 快指针先移动n次
        for (let i = 0; i < n; i++) {
            quick = quick.next;
        }
    
        // 两个一起走,直到快指针走完
        while(quick) {
            quick = quick.next;
            slow = slow.next;
        }
    
        // 删除目标就是slow的下一个
        slow.next = slow.next.next
    
        // 结果是dummy的下一个
        return dummy.next;
    };
    

    备注:

    虽然C的性能高,但是表达起来JS最方便;
    学算法才是主要的,所以用JS表达。

    相关文章

      网友评论

          本文标题:删除链表的倒数第 N 个结点 2022-02-26 周六

          本文链接:https://www.haomeiwen.com/subject/phjcrrtx.html