快慢指针法,定义一个fast和一个slow。让fast的速度是slow速度的两倍,当fast到链表的最后一个节点位置时,slow就处于中间节点,这个时候,输出slow。
两种写法:
第一种:
public ListNode middleNode(){
//当fast的速度是slow速度的两倍时,当fast走到最后一个节点时,slow出于中间位置。
ListNode fast = head;
ListNode slow = head;
while(fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
}
return slow;
}
第二种:
public ListNode middleNode(){
//当fast的速度是slow速度的两倍时,当fast走到最后一个节点时,slow出于中间位置。
ListNode fast = head;
ListNode slow = head;
while(fast.next != null && fast.next.next != null) {
fast = fast.next.next;
slow = slow.next;
}
return slow;
}
第一种和第二种的区别:
- 当链表的长度时奇数时,两者计算的结果是相同的
- 当链表为偶数时,中间节点有两个,第一种计算的中间节点是两个中右边的那个,第二种方法是左边的那个。