一、题目描述
输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第1个结点为链表的尾指针。
链表结点定义如下:
class ListNode{
int value;
ListNode next;
public ListNode(){
}
public ListNode(int value, ListNode next){
this.value = value;
this.next = next;
}
}
正常返回倒数第k个结点指针,异常返回空指针。
要求:
- 正序构建链表;
- 构建后要忘记链表长度。
数据范围:链表长度满足 1≤n≤1000 ,k≤n ,链表中数据满足 0≤val≤10000 。
二、输入描述
- 输入链表结点个数
- 输入链表的值
- 输入k的值
三、输出描述
输出一个整数。
四、解题思路
- 从输入中读取链表结点的个数;
- 创建一个头节点header;
- 循环读取链表的值,创建新的节点并将其插入到头节点之后,实现正序构建链表;、
- 读取目标位置k;
- 使用双指针法,定义两个指针fast和slow,初始时都指向头节点;
- 将fast指针向后移动k个位置;
- 同时移动fast和slow指针,直到fast指针到达链表尾部;
- 此时,slow指针指向的就是倒数第k个节点;
- 输出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 实现【跳房子II】【2023 B卷 100分】,附详细解题思路
🏆本文收录于,华为OD机试(JAVA)(2022&2023)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。