给定一个头结点为 head 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
思路
链表没有index 确认下标,可以循环吧所有的节点放入数组中,然后取数组的中间节点
/**
* @param {ListNode} head
* @return {ListNode}
*/
var middleNode = function(head) {
let A = [head]
while(A[A.length -1].next != null){
A.push(A[A.length -1].next)
}
return A[Math.trunc(A.length / 2)]
};
二
通过双指针,第一个指针每次移动两个节点,第二个指针移动一个,当第一个指针移动到结束,第二个指针刚好在中间,如果有俩个中间节点,则返回第二个中间节点
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var middleNode = function(head) {
let first = head,
last = head
while(first && first.next && first.next.next){
first = first.next.next
last = last.next
}
return first.next ? last.next : last
};