以下是我的反转链表的代码:
public LinkedList reverse() {
LinkedList m = new LinkedList();
Node temp = this.getHeadNode();
while(temp!= null) {
m.insertFirst(temp.getElement());
temp = temp.getNext();
}
m.getTailNode().setNext(null);
return m;
}
对于在我的函数中声明的局部变量LinkedList m,这是否意味着我使用了额外的O(n)量空间还是被认为是恒定的空间量?
答案 0 :(得分:1)
嗨,我认为一种更好的方法是在不创建辅助列表的情况下撤销链接列表。
答案 1 :(得分:1)
只需要三个指针在开始时初始化所有三个,假设这些指针是x,y,z然后移动y = x->接下来,z = y->接下来,y-> next = x,x = y ;这样做直到x到达列表的末尾。
答案 2 :(得分:0)
因为您正在创建链接列表的新实例 - 您将在内存中拥有2个列表副本。该列表将包含对象的引用,因此如果要计算对象的实例 - 那么您是安全的,并且额外的内存量是O(1)。但是list本身需要一些内存,所以如果你计算列表中“cells”的数量 - 那么是的,你就会使用O(N)额外的内存。
答案 3 :(得分:0)
这就是我所做的:
public LinkedList reverse1() {
Node temp1 = tail;
Node temp2 = head;
Node temp3 = new Node(this.removeFirst());
temp1.setNext(temp3);
temp3.setNext(null);
//head = temp1;
tail = temp3;
while(head != temp1) {
temp2 = new Node(this.removeFirst());
temp2.setNext(temp3);
temp1.setNext(temp2);
temp3 = temp2;
}
return this;
}
这还不错吗?
答案 4 :(得分:0)
这是我在C#中实现的线性时间和常量空间中反转LinkedList的方法。我希望它有所帮助。我们只是颠倒节点之间的链接,并使第一个节点成为最后一个节点和最后一个节点。
Node p1, p2, t1, t2;
p1 = head;
p2 = p1.next;
while (p2 != null)
{
t1 = p2;
t2 = p2.next;
p2.next = p1;
p1 = t1;
p2 = t2;
}
head.next = null;
head = p1;