题目描述
给定一个单链表 𝐿,请编写程序输出 𝐿中间结点保存的数据。如果有两个中间结点,则输出第二个中间结点保存的数据。
例如:给定 𝐿 为 1→7→5,则输出应该为 7;给定 𝐿为 1→2→3→4,则输出应该为 3。
输入描述
输出描述
对每个测试用例,在一行中输出 𝐿中间结点保存的数据。如果有两个中间结点,则输出第二个中间结点保存的数据。
代码实现
import java.util.*;
public class Main {
/**
输入示例:
00100 4
00000 4 -1
00100 1 12309
33218 3 00000
12309 2 33218
*/
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
//头指针
int head = scanner.nextInt();
//数值个数
int count = scanner.nextInt();
//存储输入的每行数据,key存储当前节点指针,value存储当前节点数值和指向下一个节点的指针
Map<Integer, int[]> map = new HashMap(count);
for(int i = 0; i< count; i++) {
int addr = scanner.nextInt();
int num = scanner.nextInt();
int next = scanner.nextInt();
int[] nums = new int[]{num, next};
map.put(addr, nums);
}
//存储链表顺序读取后的节点数值
List<Integer> list = new ArrayList<>();
//如果map中存在当前节点
while(map.containsKey(head)) {
//获取当前节点的数值和下一个节点的指针
int[] nums = map.get(head);
list.add(nums[0]);
//如果下一个节点不存在,则推出循环
if(nums[1] == -1) {
break;
}
//设置下一个节点指针为头指针
head = nums[1];
}
//输出中间位置的数值
System.out.println(list.get(list.size()/2));
//输出结果:3
}
}