牛客Top101 JS实现得到链表中倒数最后k个结点

描述

输入一个长度为 n 的链表,设链表中的元素的值为 ai ,返回该链表中倒数第k个节点。

如果该链表长度小于k,请返回一个长度为 0 的链表。

  

数据范围:0 ≤ n ≤ 10^50≤n≤105,0 ≤ ai ≤ 10^9,0 ≤ k ≤ 10^9

要求:空间复杂度 O(n),时间复杂度 O(n)

进阶:空间复杂度 O(1),时间复杂度 O(n)

例如输入{1,2,3,4,5},2时,对应的链表结构如下图所示:

其中蓝色部分为该链表的最后2个结点,所以返回倒数第2个结点(也即结点值为4的结点)即可,系统会打印后面所有的节点来比较。

扫描二维码关注公众号,回复: 15119580 查看本文章

示例1

输入:

{1,2,3,4,5},2

返回值:

{4,5}

说明:

返回倒数第2个节点4,系统会打印后面所有的节点来比较。 

示例2

输入:

{2},8

返回值:

{}

思路:首先需要判断k是不是大于链表的长度,所以要先通过遍历得到链表的长度,得到之后直接判断即可,如果大于了链表的长度就返回null,再者需要判断k是否等于0,因为没有倒数第0个元素,所以如果k等于0也要返回null,还有一种情况是链表为空也要返回null。后续逻辑就很简单了就是判断链表是否到达第几个,达到第几个就直接返回即可。完整代码如下:

/*
 * function ListNode(x){
 *   this.val = x;
 *   this.next = null;
 * }
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param pHead ListNode类 
 * @param k int整型 
 * @return ListNode类
 */
function FindKthToTail( pHead ,  k ) {
    // write code here
    let n=0;
    let n1=0;
    let p1=pHead;
    while(p1) {
        n++;
        p1=p1.next;
    }
    if(k>n||k===0||pHead===null) {
        return null;
    }
    else {
        while(pHead) {
            n1++;
            if(n1===n-k+1) {
                return pHead;
            }
            else {
                pHead=pHead.next;
            }
            
        }
    }
}
module.exports = {
    FindKthToTail : FindKthToTail
};

猜你喜欢

转载自blog.csdn.net/qq_43781887/article/details/128197475