《剑指offer》— JavaScript(14)链表中倒数第k个结点

链表中倒数第k个结点

题目描述

输入一个链表,输出该链表中倒数第k个结点。


思路

  1. 两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走(k-1)步,到达第k个节点;
  2. 然后两个指针同时往后移动,当第一个结点到达末尾的时候,第二个结点所在位置就是倒数第k个节点了。
  3. 本题考察鲁棒性,因此要判断空值和负值以及k值不能超过链表的长度。
  4. 本题链表不含头结点。

实现代码

// Node用来标识结点,element用来保存节点上的数据,next用来保存指向下一个节点的链接
function Node(element) {
    this.element = element;
    this.next = null;
}

/* 在Node的原型链上添加insert方法,
判断链表是否为空,若为空,则在添加第一个结点,
若不为空,则在当前结点后面添加新的结点。*/
Node.prototype.insert = function(newElement) {
    if (this.element === undefined) {
        this.element = newElement;
    } else {
        var curNode = this;
        while (curNode.next !== null) {
            curNode = curNode.next;
        }
        var newNode = new Node(newElement);
        curNode.next = newNode;
        newNode.next = null;
    }
};

// 查找链表中倒数第k个结点
function FindKthToTail(head, k) {
    if (head.element === undefined) {
        return new Error("head为空链表!");
    }
    if (k <= 0) {
        return new Error("k小于等于0!");
    }
    var pre = head;
    var last = head;
    for (var i = 1; i < k; i++) {
        if (pre.next !== null) {
            pre = pre.next;
        } else {
            return new Error("k值过大!");
        }
    }
    while (pre.next !== null) {
        pre = pre.next;
        last = last.next;
    }
    return last;
}

var node = new Node(); 
node.insert("Kobe");
node.insert("Curry");
node.insert("Russel");
node.insert("Klay");
node.insert("Tracy");
console.log(node);
var empty = {};

举例

FindKthToTail(node, -2);

图片.png

FindKthToTail(empty , 2);

图片.png

FindKthToTail(node, 100);

图片.png

FindKthToTail(node, 2);

图片.png

推荐阅读更多精彩内容

  • //leetcode中还有花样链表题,这里几个例子,冰山一角 求单链表中结点的个数----时间复杂度O(n)这是最...
    暗黑破坏球嘿哈阅读 569评论 0 6
  • 转载请注明出处:http://www.jianshu.com/p/c65d9d753c31 在上一篇博客《数据结构...
    Alent阅读 2,510评论 3 71
  • 大学的时候不好好学习,老师在讲台上讲课,自己在以为老师看不到的座位看小说,现在用到了老师讲的知识,只能自己看书查资...
    和珏猫阅读 293评论 1 2
  • B树的定义 一棵m阶的B树满足下列条件: 树中每个结点至多有m个孩子。 除根结点和叶子结点外,其它每个结点至少有m...
    笨尛孩你谁啊阅读 3,505评论 0 20
  • 剑指 offer 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成...
    faremax阅读 566评论 0 5