使用堆栈可以更好地反转链表吗?
Is reversing a linked list better by using stacks?
我正在使用以下代码反转单向链表:
Node prevNode = null;
Node currNode = head;
while (currNode != null) {
Node next = currNode.next;
currNode.next = prevNode;
prevNode = currNode;
currNode = next;
}
head = prevNode;
然后,当我material 研究有关堆栈的一些内容时,它建议最好使用堆栈来反转任何列表。
肯定很容易想象我们确实弹出了元素并将它们推入一个新的堆栈,最后它基本上被逆转了。但是这两种方法哪种更好或者花费的时间更短?
就地反转总是比使用堆栈更好,因为我们没有使用任何额外的 space。但是,对于不可变列表,唯一的反转选项是也使用堆栈。
通过反转我想这意味着在两个元素之间建立与之前相反的 链接 即如果它是 1->2->3->4
那么现在是 1<-2<-3<-4
.
最好的方法 是将此列表分成两部分,即 current 和 rest,这是一种递归方法。
时间复杂度:O(n),
Space 复杂度:O(1)
1->2->3->4
1->2->3<-4
(其余为 4)
1->2<-3<-4
1<-2<-3<-4
您可以在此处找到此方法的详细信息:enter link description here
我正在使用以下代码反转单向链表:
Node prevNode = null;
Node currNode = head;
while (currNode != null) {
Node next = currNode.next;
currNode.next = prevNode;
prevNode = currNode;
currNode = next;
}
head = prevNode;
然后,当我material 研究有关堆栈的一些内容时,它建议最好使用堆栈来反转任何列表。
肯定很容易想象我们确实弹出了元素并将它们推入一个新的堆栈,最后它基本上被逆转了。但是这两种方法哪种更好或者花费的时间更短?
就地反转总是比使用堆栈更好,因为我们没有使用任何额外的 space。但是,对于不可变列表,唯一的反转选项是也使用堆栈。
通过反转我想这意味着在两个元素之间建立与之前相反的 链接 即如果它是 1->2->3->4
那么现在是 1<-2<-3<-4
.
最好的方法 是将此列表分成两部分,即 current 和 rest,这是一种递归方法。
时间复杂度:O(n), Space 复杂度:O(1)
1->2->3->4
1->2->3<-4
(其余为 4)
1->2<-3<-4
1<-2<-3<-4
您可以在此处找到此方法的详细信息:enter link description here