题目描述:
给定一个带有头结点 head
的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
示例 :
输入:[1,2,3,4,5] 输出:3
输入:[1,2,3,4,5,6] 输出:4,由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点。
方法分析:
对于链表,我经常通过将其转换为数组来实现一些操作。在该题中,我们遍历链表,将其每个节点的值放入结果数组中,返回中间节点的值的就可以了。通过数组索引来实现,是比较方便的一种做法。
代码实现:
var middleNode = function(head) {
let result = [head];
while (result[result.length - 1].next) {
result.push(result[result.length - 1].next);
}
return result[Math.floor(result.length / 2)];
};
代码解析:
单向链表都是从头部 head 开始顺次迭代的。题目已经给出了 head ,我们首先初始化结果数组,并将 head 放入其中。当 next 指针指向的节点内容不是 null,就代表链表并未迭代完成;此时,将 next 指针指向的节点内容放入结果数组中即可,然后数组的长度就会被更新。最后返回中间节点,对索引值向下取整即可。
该算法的时间复杂度为:
该算法的空间复杂度为:
相关链接:https://leetcode-cn.com/problems/middle-of-the-linked-list/description/