给定一个带有头结点 head
的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
这题主要记录下快慢指针法,当用慢指针 slow
遍历列表时,让另一个指针 fast
的速度是它的两倍。当 fast
到达列表的末尾时,slow
必然位于中间。
public ListNode middleNode(ListNode head) {
int len = 0;
ListNode p = head;
// 计算链表长度
while (p != null) {
++len;
p = p.next;
}
int m = len / 2;
p = head;
for (int i = 0; i < m; i++) {
p = p.next;
}
return p;
}
/**
* 快慢指针法
*/
public ListNode middleNode2(ListNode head) {
ListNode slow = head, fast = head;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
}