來刷 LeetCode 吧! 05 876. Middle of the Linked List
LeetCode
題目分析
給一個單向鏈表( single linked list )的頭節點,返回該鏈表的中間節點。
若有兩個中間節點,則返回第二個中間節點。
第一直覺(錯誤)
看題目給的範例圖,我以為可以使用 head.length、head.slice
var middleNode = function (head) { if (head.length % 2 === 0) { return head.slice(head.length / 2); } else { return head.slice(head.length / 2 + 1); } };
直接噴錯
快慢指針
爬了文才知道的用法。
原理為:
- 初始化兩個指針 slow 和 fast,都指向鏈表的頭節點。
- 快指針 fast 每次移動兩步,慢指針 slow 每次移動一步。
- 當快指針到達鏈表末尾時,慢指針正好在鏈表的中間節點。如果鏈表長度是偶數,慢指針會在第二個中間節點上。
var middleNode = function (head) { let slow = head; let fast = head; while (fast !== null && fast.next !== null) { slow = slow.next; fast = fast.next.next; } return slow; };