leetcode-019-删除链表倒数第N个结点(Remove Nth Node From End of List)

leetcode第19题

Given a linked list, remove the n-th node from the end of list and return its head.
给定一个链表,删除链表的倒数第 n 个节点,而且返回链表的头结点。

题中的坑

这个题要注重的是:网站定义的链表构造head指向第一个有用元素,没有纯粹意义上的头结点,我前两次提交就是由于这个问题没过。由于,如有一个真正的头结点,则一切的元素处置惩罚方式都一样。但以第一个有用元素为头结点,就致使算法的不一致,须要零丁处置惩罚第一个有用元素(头结点)。

问题的分外限定

Could you do this in one pass?
你能尝试运用一趟扫描完成吗?

还好,问题束缚,给定n值肯定会是有用的(Given n will always be valid.),这能够少写很多的边境推断。

我的解答(javascript)

思绪

n值肯定有用,又限定在一趟扫描过程当中完成,那就是要在扫描的过程当中,保留删除操纵的一切信息。很轻易想到,链表的长度肯定大于n,我们迭代处置惩罚的是当前元素,故只须要记着当前元素往前的第n+1个元素(即被删除元素的前一个)就能够了。

链接结点定义

function ListNode(val) {
    this.val = val
    this.next = null;
}

单链接生成器(用于当地测试)

function build(arr) {
    if(arr.length === 0)         //注重:leetcode的空链表逻辑是head=null
        return null
    let rs = new ListNode(arr[0])
    let head = rs
    for(let i = 1; i < arr.length; i++) {
        let newOne = new ListNode(arr[i])
        rs.next = newOne
        rs = newOne
    }
    return head
}

当地测试代码

    let rs = removeNthFromEnd(build([1,2,3,4,5]), 2)
    let cur = rs
    let str = ''
    while(cur !== null) {
        str += `${cur.val} ${cur.next ? '->' : ''} `
        cur = cur.next
    }
    console.log(str)

解答算法

var removeNthFromEnd = function(head, n) {
    let cur = head        //迭代处置惩罚当前元素
    let m = 0             //偏移量,用来指导要删除的元素
    let del = head        //要删除的元素
    while (cur !== null) {
        if(m > n) {         //到达并偏移指导窗口
            del = del.next
        } else {
            m++
        }
        cur = cur.next
    }
    if (del === head && m === n)  //注重,删除头元素与别的元素是不一样的
        head = head.next          //测试用例:[1] 1; [1,2] 2
    else 
        del.next = del.next.next
    return head
};

leetcode提交效果

Runtime: 56 ms, faster than 100.00% of JavaScript online submissions for Remove Nth Node From End of List.

我的第一个运转速率凌驾一切提交者的解答,^_^

完全代码

https://github.com/zhoutk/leetcode/blob/master/javascript/qs019_removeNthFromEnd_1.js

小结

本文重要标记leetcode中的链表构造的特殊性,head直接指向第一个有用元素。

    原文作者:zhoutk
    原文地址: https://segmentfault.com/a/1190000017800786
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞