剑指 Offer 22. 链表中倒数第k个节点 (Java 面试版)

题目描述:

输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。

示例:

给定一个链表: 1->2->3->4->5, 和 k = 2.

返回链表 4->5.

题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof

代码及详细标注:

首先在同一个包下定义一个 ListNode 类

package com.sjmp;

/**
 * @ClassName ListNode
 * @Description TODO
 * @Author sjmp1573
 * @Date DATE{TIME}
 */

// Definition for singly-linked list
public class ListNode{
    int val;
    ListNode next;
    ListNode(int x){
        this.val = x;
    }
}
package com.sjmp;

/**
 *  Time O(n),Space O(1)
 * @ClassName getKthFromEnd22
 * @Description TODO
 * @Author sjmp1573
 * @Date DATE{TIME}
 */
public class getKthFromEnd22 {

    public static void main(String[] args) {
        /*功能测试(第 k 个节点在链表的中间;第 k 个节点是链表的头节点;第 k 个链表是链表的尾节点)
        特殊输入测试(链表头节点为空指针;链表的节点总数少于 k ;k 小于等于0);*/

        ListNode node1 = new ListNode(1);
        ListNode node2 = new ListNode(2);
        ListNode node3 = new ListNode(3);
        ListNode node4 = new ListNode(4);
        ListNode node5 = new ListNode(5);
        node1.next = node2;
        node2.next = node3;
        node3.next = node4;
        node4.next = node5;

//        ListNode node = null;

        ListNode res = getKthFromEnd(node1, 2);

        while (res != null){
            System.out.println(res.val);
            res = res.next;
        }
        if(res == null){
            System.out.println("null");
        }


    }

    public static ListNode getKthFromEnd(ListNode node, int k) {
            /*   鲁棒性
            1.输入指针为空指针 ;
            2.输入的 K 值小于等于 0 ;
            3.输入的 K 值大于 ListNode 的长度。
            */
        // 处理上述 1、2 问题
        if (node == null || k <= 0) {
            return null;
        }

        ListNode pBehind = node;
        //  一、先定义一个快指针,跑到大小为 k 的位置结束
        for (int i = 1; i <= k-1; i++) {
            //这里添加一个限制条件,处理上述鲁棒性 3. 的情况。
            if (pBehind.next == null){
                // 如果 k 大于 ListNode 的长度,则返回 null 。
                return null;
            }else{
                pBehind = pBehind.next;
            }
        }
        //  二、再标记一个慢指针,两指针的距离为 k
        ListNode pHead = node;
        // 三、两个指针同时向后移动
        while (pBehind.next != null){
            pBehind = pBehind.next;
            pHead = pHead.next;
        }
        //四、当 pBehind 移动到尾节点时。 pHead 就是倒数第 k 个 node。
        return pHead;
    }

}

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页