算法通关村第一关—链表经典问题之链表的中间结点笔记
源码地址:GitHub-算法通关村
题目地址:LeetCode
解题思路:
- 初始化两个指针
slow
和fast
,它们都指向链表的头节点head
。 - 在循环中,同时移动
slow
和fast
指针。每次迭代,slow
指针向前移动一步,而fast
指针向前移动两步。 - 循环的条件是
fast
不为null
并且fast.next
不为null
。这样做的目的是确保在每次迭代时,fast
指针都至少能够移动两步,避免出现空指针异常。 - 当
fast
到达链表末尾时,即fast
为null
或者fast.next
为null
,循环结束。 - 最终返回
slow
指针的位置,即链表的中间节点。由于fast
指针每次移动两步,而slow
指针每次移动一步,所以当循环结束时,slow
指针正好指向链表的中间节点。
这种快慢指针法的原理在于,快指针的速度是慢指针的两倍,所以当快指针到达链表末尾时,慢指针刚好在链表的中间位置。
/**
* 快慢指针
*
* @param head
* @return
*/
public ListNode middleNode(ListNode head) {
ListNode slow = head, fast = head;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
}