题解 | #输出单向链表中倒数第k个结点#

输出单向链表中倒数第k个结点

https://www.nowcoder.com/practice/54404a78aec1435a81150f15f899417d

示例需要对链表和双指针应用有了解,是对高赞示例的仿写,添加了必要的注释

import java.util.Scanner;

/**
* 示例是对 https://www.nowcoder.com/users/4479402 同学的仿写,加入了必要的注释 ~ 感谢提供思路
*/
public class Main {
    public static class Node {
        int key;
        Node next;

        public Node(int key) {
            this.key = key;
            this.next = null;
        }
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意用例里面有些用例是使用空格进行分隔的,需要用 hasNext,否则接收不到
        while (in.hasNext()) {
            // 列表元素数量
            int n  = in.nextInt();
		    // 异常范围
            if (n <= 0) {
                System.out.println(0);
                continue;
            }
            // 头指针
            Node perv = new Node(in.nextInt());
            // 索引指针,通过索引指针的移动给链表装入数据
            Node index = perv;
            for (int i = 0; i < n - 1; i ++) {
                int e = in.nextInt();
                index.next = new Node(e);
                index = index.next;
            }
            // 获取 k 位置
            int k = in.nextInt();
            // 异常范围
            if (k <= 0 || k > n) {
                System.out.println(0);
                continue;
            }
            // 这里使用快慢指针操作
            // 注意:fast指针先开始“从前往后”找第 k 个位置,注意是“从前往后”,而不是“从后往前”
            Node fast = perv;
            Node slow = perv;
            for (int i = 0; i < k; i++) {
                fast = fast.next;
            }
            // fast指针找到后,再让slow指针跟着fast指针一起向后移动
            // 直到fast指针移动到末尾位置,slow对着的正好是从末尾到 k 的位置
            while (fast != null) {
                fast = fast.next;
                slow = slow.next;
            }
            System.out.println(slow.key);
        }
    }
}

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务