快慢指针原理--快速找到未知长度单链表的中间节点
package com.java.dataStruct;
//节点类
public class Node<E> {
E item;
Node next;
public Node(){
}
public Node(E element){
this.item = element;
}
public Node(E element, Node next){
this.item = element;
this.next = next;
}
}
Node p1,r1;
Node L1 = new Node<String>("head");
r1 = L1;
// 先利用尾插法创建一个链表
for(int i=1; i<=20; i++){
p1 = new Node<String>();
p1.item = "value"+i;
r1.next = p1;
r1 = p1;
}
r1.next = null;
// while(L1.next != null){
// //System.out.p1r1intln(L.item);
// System.out.println(L1.next.item);
// L1 = L1.next;
// }
/*
* 快速找到未知长度单链表的中间节点
*
* 快慢指针原理
* 设置两个指针 search,mid都指向单链表的头节点。
* 其中search的移动速度是mid的2倍。
* 当search指向末尾节点的时候,mid正好就在中间了。
*/
Node search,mid;
search = L1;
mid = L1;
for(;search.next != null;){
if(search.next.next != null){
search = search.next.next;
mid = mid.next;
}else{
search = search.next;
}
}
System.out.println("结果: "+mid.item);