链表中倒数最后k个结点

描述

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

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

数据范围:0≤n≤105,0≤ai≤109,0≤k≤109

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

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

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

倒数k个结点.png

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

示例1

输入:{1,2,3,4,5},2
返回值:{4,5}
说明:返回倒数第2个节点4,系统会打印后面所有的节点来比较。

示例2

输入:{2},8
返回值:{}

解题思路:

1、统计全部节点的个数;
2、根据倒推法,找到正着数的元素个数res;
3、增加一个指针,res每次减1,依次向后移动,最后返回;

/**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param pHead ListNode类 
     * @param k int整型 
     * @return ListNode类
     */
    public ListNode FindKthToTail (ListNode pHead, int k) {
        // write code here
        ListNode prev = pHead;
        //统计链表总数据的个数
        int n=0;
        while(prev != null){
            prev = prev.next;
            n++;
        }
        //如果k>链表总个数,直接返回
        if(k >n){
            return null;
        }
        //如果k=链表总个数,返回链表即可
        if(k == n){
            return pHead;
        }
        //倒数第k个,表示正数第n-k个
        int res = n-k;
        ListNode newNode = pHead;
        while(res>0){
            newNode = newNode.next;
            res--;
        }
        return newNode;
    }

你可能感兴趣的:(链表中倒数最后k个结点)