给定一个带有头结点 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;
}
本文介绍了一种使用快慢指针法寻找链表中间节点的高效算法。通过一个慢指针和一个快指针,当快指针到达链表末尾时,慢指针恰好位于中间,巧妙解决了链表中寻找中间节点的问题。
690

被折叠的 条评论
为什么被折叠?



