华为OD机试 Java 实现【输出单向链表中倒数第k个结点】【LeetCode练习题】,附详细解题思路-LMLPHP

一、题目描述

输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第1个结点为链表的尾指针。

链表结点定义如下:

class ListNode{
    int value;
    ListNode next;
    public ListNode(){
         
    }
    public ListNode(int value, ListNode next){
        this.value = value;
        this.next = next;
    }
}

正常返回倒数第k个结点指针,异常返回空指针。

要求:

  1. 正序构建链表;
  2. 构建后要忘记链表长度。

数据范围:链表长度满足 1≤n≤1000 ,k≤n ,链表中数据满足 0≤val≤10000 。

二、输入描述

  1. 输入链表结点个数
  2. 输入链表的值
  3. 输入k的值

三、输出描述

输出一个整数。

四、解题思路

  1. 从输入中读取链表结点的个数;
  2. 创建一个头节点header;
  3. 循环读取链表的值,创建新的节点并将其插入到头节点之后,实现正序构建链表;、
  4. 读取目标位置k;
  5. 使用双指针法,定义两个指针fast和slow,初始时都指向头节点;
  6. 将fast指针向后移动k个位置;
  7. 同时移动fast和slow指针,直到fast指针到达链表尾部;
  8. 此时,slow指针指向的就是倒数第k个节点;
  9. 输出slow指针指向节点的值;

五、Java算法源码

public static void main(String[] args){
    Scanner scan = new Scanner(System.in);
    while (scan.hasNext()) {
        int num = scan.nextInt();
        ListNode header = new ListNode();
        for (int i=0; i< num;i++) {
            int value = scan.nextInt();
            ListNode node = new ListNode(value, header.next);
            header.next = node;
        }
        int target = scan.nextInt();
        for (int i=0; i<target; i++) {
            header = header.next;
        }
        System.out.println(header.value);
    }
}

六、效果展示

1、输入

8
1 2 3 4 5 6 7 8
4

2、输出

5

华为OD机试 Java 实现【输出单向链表中倒数第k个结点】【LeetCode练习题】,附详细解题思路-LMLPHP


🏆下一篇:华为OD机试真题 Java 实现【跳房子II】【2023 B卷 100分】,附详细解题思路

🏆本文收录于,华为OD机试(JAVA)(2022&2023)

本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。

华为OD机试 Java 实现【输出单向链表中倒数第k个结点】【LeetCode练习题】,附详细解题思路-LMLPHP

06-09 15:29