我正在使用以下代码撤消单个链接列表:
Node prevNode = null;
Node currNode = head;
while (currNode != null) {
Node next = currNode.next;
currNode.next = prevNode;
prevNode = currNode;
currNode = next;
}
head = prevNode;
然后,当我浏览一些关于堆栈的材料时,它建议逆转任何列表最好通过使用堆栈来完成。
可以肯定的是,很容易想象我们确实会弹出元素并将它们推入一个新的堆栈中,最后它基本上是相反的。但是这两种方法中的哪一种更好或者花费更少的时间?
答案 0 :(得分:3)
通过反转,我猜这意味着在两个元素之间使链接与之前的相反,即如果它是1->2->3->4
那么它现在是1<-2<-3<-4
。
最佳方式这样做是将此列表分为两部分,即当前和 rest ,这是一种递归方法。< / p>
时间复杂度:O(n), 空间复杂度:O(1)
1->2->3->4
1->2->3<-4
(其余4位)
1->2<-3<-4
1<-2<-3<-4
您可以在此处找到此方法的详细信息:enter link description here
答案 1 :(得分:2)
就地反转总是比使用堆栈更好,因为我们没有使用任何额外的空间。但是,对于不可变列表,反转的唯一选择是使用堆栈。