这个方案真是太牛逼了,叫快慢指针,开始我还不知道快慢指针是啥意思 现在觉得能想出来这种方法的人,脑子真的是很聪明
// 通过建立两个指针,slow指针每次只往下走一位,fast每次都往下走两位,
// 这样在 fast 到达终点的时候,slow 就刚好走到一半了,这样的复杂度就只是 O(n)
// 太牛逼了,而且只需要遍历一次就可以
const middleNode = function (head) {
slow = fast = head;
while (fast && fast.next) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
};最基础的方法,就是遍历一次,然后把所有的数据添加到数组中,然后取数组的中间值
const middleNode = function (head) {
let arr = [head];
while (arr[arr.length - 1].next !== null) {
arr.push(arr[arr.length - 1].next);
}
return arr[Math.trunc(arr.length / 2)];
};使用单指针的方式,就必须要循环两次了
const middleNode = function (head) {
let n = 0;
let cur = head;
while (cur.next) {
n++;
cur = cur.next;
}
let k = 0;
cur = head;
while (k < Math.trunc(n / 2)) {
k++;
cur = cur.next;
}
return cur;
};复杂度分析
时间复杂度:O(N),其中 N 是给定链表的结点数目。
空间复杂度:O(1),只需要常数空间存放变量和指针。