在采访中问我要从链表的中间节点找出第二个节点中的值吗?他们希望这样做的时间复杂度为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
。
解决方案倍受赞赏。
答案 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)
解决方案之一可能是:
List
中。i
。i + 2
)。i + 2
的引用答案 2 :(得分:0)
另一种解决方案是,如果您拥有一个保存链表大小的变量,则直接迭代链表。
midPlusTwo
)midPlusTwo
时停止答案 3 :(得分:0)
方法是使用慢速快速指针方法在链接列表的中间找到节点。然后只找到中间节点的下一个节点的下一个节点。
这样,您可以在O(1)空间和O(N)时间复杂度中获得所需的节点。
@ sourabh1024已编写代码。看看。