利用快慢指针找链表的中间节点
给出一个链表,如:
1->2->3->4->5->6
找出它的中间节点,如果链表个数为偶数,则找出中间两个节点的后一个节点。
思路分析:
可以利用两个指针,分别从链表头部遍历链表,一个每次走一个节点,一个每次走两个节点。
这样,链表结点个数有奇数个的时候,当快指针走到NULL前面一个结点的时候,此时,慢指针此时刚好指向链表中间结点。
链表结点个数有偶数个的时候,当快指针走到NULL的时候,此时,慢指针此时刚好指向链表中间结点。
如此代码便可写出:
public class Main2 {
public static void main(String[] args) {
//先构建一个链表
LinkNode head=new LinkNode(1);
LinkNode l1=new LinkNode(2);
LinkNode l2=new LinkNode(3);
LinkNode l3=new LinkNode(4);
LinkNode l4=new LinkNode(5);
LinkNode l5=new LinkNode(6);
head.next=l1;
l1.next=l2;
l2.next=l3;
l3.next=l4;
l4.next=l5;
LinkNode findMiddle = findMiddle(head);
System.out.println(findMiddle.val);
}
public static LinkNode findMiddle(LinkNode head) {
if(head==null||head.next==null) {
return null;
}
LinkNode fast=head;
LinkNode slow=head;
while(fast!=null&&fast.next!=null) {
fast=fast.next.next;
slow=slow.next;
}
return slow;
}
}
class LinkNode{
int val;
LinkNode next;
LinkNode(int val){
this.val=val;
}
}
输出结果: