25 Middle of the Linked List 链表中结点

87 阅读1分钟

876. Middle of the Linked List

解题思路

  1. 假设总长 len = 0,结果值 result = head
  2. 当 head.next 不为 null时, len++
  3. 计算 mid节点时分为两种情况,偶数取 len + 1,奇数取 len 4.当 mid > 1循环找中节点,result = result.next 返回 result即可代码
/**
 * 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 len = 0
  let result = head

  while(head !== null) {
    len++
    head = head.next
  }
  let mid = len % 2 === 0 ?  Math.ceil((len + 1) / 2) :  Math.ceil(len / 2)
  while(mid > 1) {
      mid--
      result = result.next
  }
  return result
};

最简双指针解法

解题思路

双指针无非就是一个指向 head.next 一个指向 mid 即链表的中结点,会发现一个规律 偶数步移动 mid,奇数步不动 mid

  1. 当head指针向后移动偶数 len 时, mid 向后挪一步否则不动
  2. headnull 时跳出循环,直接返回 mid 即可

代码

/**
 * 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 len = 0
  let mid = head

  while(head !== null) {
    len++
    if(len % 2 === 0) {
        mid = mid.next
    }
    head = head.next
  }
  return mid
};