如何从链表的中间元素中找到第二个元素?

时间:2019-03-29 06:31:10

标签: java algorithm data-structures

在采访中问我要从链表的中间节点找出第二个节点中的值吗?他们希望这样做的时间复杂度为O(n)。

我试图给出答案,以使用O(n2)获得中间元素。但这无济于事。然后尝试使用慢速指针和快速指针在O(n)中进行操作。

节点慢,快;

    while (slow.next != null and fast.next.next != null){

    }

例如。输入链接列表:1 2 3 4 5 6 7 8 9     输出节点:7

因为中间节点是5,而第二个元素是7

解决方案倍受赞赏。

4 个答案:

答案 0 :(得分:2)

Node getSecondAfterMind(Node head) {
  Node slow = head, fast = head;
  while(fast.next.next != NULL) {
    slow = slow.next;
    fast = fast.next.next;
  }
  if slow.next!= NULL && slow.next.next != NULL {
      return slow.next.next;
  }

   return NULL;
}

答案 1 :(得分:1)

解决方案之一可能是:

  1. 从头到尾遍历链表,并将每个元素的引用放入List中。
  2. 当您点击链接列表的末尾时,请根据列表的大小找到中间元素的索引(i
  3. 将此索引增加2(i + 2)。
  4. 遵循列表中索引为i + 2的引用
  5. 您知道了这个元素。

答案 2 :(得分:0)

另一种解决方案是,如果您拥有一个保存链表大小的变量,则直接迭代链表。

  1. 将大小除以2得到中间索引
  2. 将该索引增加2(我们将其称为midPlusTwo
  3. 迭代链接列表并进行计数。
  4. 当计数器等于midPlusTwo时停止

答案 3 :(得分:0)

方法是使用慢速快速指针方法在链接列表的中间找到节点。然后只找到中间节点的下一个节点的下一个节点。

这样,您可以在O(1)空间和O(N)时间复杂度中获得所需的节点。

@ sourabh1024已编写代码。看看。