问题描述:
找到链表的中间节点,并输出节点的信息。
解题思路:
定义一个快指针,再定义一个慢指针,快指针每次走两步,慢指针每次走一步。当快指针指向结尾的时候,慢指针刚好指向中间节点。
代码如下:
注意:如果你对代码中的 speed != null 这个判断条件有疑问的话,你把节点设置成奇数个你就懂了。
package com.guigu.LinkedListDemo;
public class SpeedAndSlow {
public static void main(String[] args) {
// 创建一个单链表
LinkedList list = new LinkedList();
HNode hNode1 = new HNode(1, "tom");
HNode hNode2 = new HNode(2, "jack");
HNode hNode3 = new HNode(3, "simth");
HNode hNode4 = new HNode(4, "cls");
list.add(hNode1);
list.add(hNode2);
list.add(hNode3);
list.add(hNode4);
// 遍历链表
list.list();
System.out.println();
HNode mid = SpeedAndSlowPointer(list);
System.out.println("位于中间的英雄是序号为" + mid.no + "的" + mid.name);
}
// 返回的指向中间节点的指针
public static HNode SpeedAndSlowPointer(LinkedList list) {
HNode speed = list.head; // 定义一个快指针,初始化为head
HNode slow = list.head; // 定义一个慢指针,初始化为head
// 循环结束时,慢指针走的路程刚好是快指针的一半
while(speed != null && speed.next != null) {
speed = speed.next.next; // 快指针每次走两步
slow = slow.next; // 慢指针每次走一步
}
return slow; // 将慢指针返回
}
}