使用恒定数量的额外空间反转链接列表

时间:2012-09-11 03:52:13

标签: linked-list reverse

以下是我的反转链表的代码:

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)量空间还是被认为是恒定的空间量?

5 个答案:

答案 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;