例如
输入:[1,2,3,4,5]
输出:此列表中的结点 3 (序列化形式:[3,4,5])
输入:[1,2,3,4,5,6]
输出:此列表中的结点 4 (序列化形式:[4,5,6])
-
偶数节点时,中间点是靠右的那个
解法:快慢指针,快指针一次走两步,慢指针一次走一步,当快指针到链表结尾NULL处或者快指针到链表下一步就是NULL时,慢指针恰好走到链表的一半
对于偶数:当快指针到链表结尾NULL处,则慢指针恰好走到链表的一半
对于奇数:当快指针到某一节点,而这一节点的next就是NULL时,则慢指针恰好走到链表的一半
图示:
刚刚开始:
结束:
public ListNode middleNode(ListNode head) {
ListNode p1 = head; // 慢指针,中间点
ListNode p2 = head; // 快指针
//注意:p2 != null 要放在“&&“的左边 因为&&有短路运算
while (p2 != null && p2.next != null) {
p1 = p1.next;
p2 = p2.next;
p2 = p2.next;
}
return p1;
}