问题:给定一个头结点为 head 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
例如:
输入:[1,2,3,4,5,6,7,8]
输出:此列表中的结点 5 (序列化形式:[4,5,6])
思路:首先要考虑链表为空的情况。利用快慢指针的方法定义一个快指针(每次走两格),慢指针(每次走一格)。当快指针走大到最后一个节点(奇数个)或者最后一个的.next处(偶数个)时,返回slow的值。由于fast每次走的都是slow的二倍,所以整体走的就是slow的二倍,slow就是中间结点的位置。
主要代码:
class ListNode{
public int val;
public ListNode next;
}
public ListNode middleNode(ListNode head){
if(head==null||head.next==null){return head;}
ListNode slow=head;
ListNode fast=head;
while((fast!=null)&&(fast.next!=null)){
fast=fast.next.next;
slow=slow.next;
}
return slow;
}