Skip to main content

876. 链表的中间节点

给定一个头结点为 head 的非空单链表,返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

示例 1:

输入:[1,2,3,4,5]
输出:此列表中的结点 3 (序列化形式:[3,4,5])
返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。
注意,我们返回了一个 ListNode 类型的对象 ans,这样:
ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.

示例 2:

输入:[1,2,3,4,5,6]
输出:此列表中的结点 4 (序列化形式:[4,5,6])
由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点。

答案

const head = {
'val':1,
'next':{
'val':2,
'next':{
'val':3,
'next':{
'val':4,
'next':{
'val':5,
'next':undefined
}
}
}
}
}

快慢指针法

思路:

  1. 定义快慢指针,快指针一次走两步,慢指针一次走一步,结束条件是 fast 存在并且下一个节点存在。
  2. 这样偶数长度的链表,slow 刚好落在 2 个中间元素的右侧。
var middleNode = function(head) {
let slow = head
let fast = head

while (fast && fast.next) {
fast = fast.next.next
slow = slow.next
}
return slow
};

console.log(middleNode(head))

递归法

var middleNode = (head) => {
// 链表长度
let size = 0

// 获取链表长度
function reverse(node) {
if(!node.next) {
size++
//console.log('node',node)
return node;
} else {
size++
//console.log('node',node)
return reverse(node.next);
}
}
reverse(head)

// round下取,floor上取
let middeleIndex = Math.floor(size/2)

// 获取指定节点
function getNode(position){
if(position >= 0 && position <= size){
let node = head
for(let i=0;i<position;i++){
node = node.next
}
return node
}
return undefined
}
const currentNode = getNode(middeleIndex)

return currentNode
};

console.log(middleNode(head))