单链表中间节点

单链表中间节点

问题

这个题目说的是,给你一个单链表,你要返回它正中间的节点。如果链表节点数量是偶数个,这个时候正中间有两个节点,你要返回它们中第二个节点。

比如说,给你的单链表是:

0 -> 1 -> 2 -> 4 -> 8

你要返回的正中间节点是 2。如果给你的链表有偶数个节点,比如:

0 -> 1 -> 2 -> 4

正中间的节点是 1 和 2,你要返回它们中第二个节点,也就是节点 2。

代码

public class AlgoCasts {

  public class ListNode {
    int val;
    ListNode next;

    ListNode(int x) {
      val = x;
    }
  }

  // Time: O(n), Space: O(1)
  public ListNode getMiddleNodeTwoPass(ListNode head) {
    ListNode p = head;
    int len = 0;
    for (; p != null; p = p.next) ++len;
    p = head;
    for (int i = 0; i < len/2; ++i) p = p.next;
    return p;
  }

  // Time: O(n), Space: O(1)
  public ListNode getMiddleNodeOnePass(ListNode head) {
    ListNode fast = head, slow = head;
    while (fast != null && fast.next != null) {
      fast = fast.next.next;
      slow = slow.next;
    }
    return slow;
  }

}

  转载请注明: ForwardXu 单链表中间节点

 上一篇
随机洗牌 随机洗牌
随机洗牌问题 这个题目说的是,给你一个整数数组表示一副牌,你要写一个随机洗牌函数来返回这个数组的一个排列。并且要保证每次返回的排列都是等概率的。假设已经给你一个完美的随机数生成器。 代码 public class AlgoCasts {
2018-12-09
下一篇 
滑动窗口中的最大值 滑动窗口中的最大值
滑动窗口中的最大值问题 这个题目说的是,给你一个整数数组和整数 k,k 表示滑动窗口的大小,滑动窗口从左向右滑过数组,每移动一个位置,你要计算出当前滑动窗口内 k 个数字的最大值。最后返回这个最大值数组。 比如说,给你的数组是 0, 4,
2018-12-09
  目录