题目: 查找链表的中间节点
比如:有链表 1->3->5->8->9->10->12->11->17 ,其中间节点为9
思路:定义两个指针,分别为slow与fast,同时从头节点开始往尾节点移动,slow每次移动一个节点,fast每次移动两个节点,直到fast到了尾节点后,停止移动,此时slow指向的节点就是中间节点。
public class LinkedList {
public void print(LinkedNode<Integer> root){
LinkedNode<Integer> tmp = root;
while (tmp.next!=null){
System.out.print(tmp.value+"->");
tmp = tmp.next;
}
System.out.print(tmp.value);
System.out.println();
}
//创建链表
public LinkedNode<Integer> constructLinkedList(LinkedNode<Integer>... nodes){
LinkedNode<Integer> root = new LinkedNode<>(0);
LinkedNode<Integer> tmp = root;
for(LinkedNode<Integer> node:nodes){
tmp.next = node;
tmp = tmp.next;
}
return root.next;
}
/**
* 5、题目:查找链表的中间节点
*/
@Test
public void test5(){
LinkedNode<Integer> node11 = new LinkedNode<>(1);
LinkedNode<Integer> node12 = new LinkedNode<>(3);
LinkedNode<Integer> node13 = new LinkedNode<>(5);
LinkedNode<Integer> node14 = new LinkedNode<>(8);
LinkedNode<Integer> node15 = new LinkedNode<>(9);
LinkedNode<Integer> node16 = new LinkedNode<>(10);
LinkedNode<Integer> node17 = new LinkedNode<>(12);
LinkedNode<Integer> node18 = new LinkedNode<>(11);
LinkedNode<Integer> node19 = new LinkedNode<>(17);
LinkedNode<Integer> root = constructLinkedList(node11,node12,node13,node14,node15,node16,node17,node18,node19);
print(root);
LinkedNode<Integer> slow = root;
LinkedNode<Integer> fast = root;
while (fast !=null && fast.next != null){
slow = slow.next;
fast = fast.next.next;
}
System.out.println("链表中间节点:"+slow.value);
}
}
输出:
1->3->5->8->9->10->12->11->17
链表中间节点:9