删除Java中的所有链接列表

时间:2014-12-25 23:39:58

标签: java linked-list singly-linked-list

我正在学习Java&数据结构。

我创建了一个删除所有链表的方法。这是代码:

public class LinkedList {
    ...
    public void purge() {
        SLLNode nextNode, iterator = headNode;

        while(iterator != null) {
            nextNode = iterator.getNext();
            iterator = null;
            iterator = nextNode;
        }
    }
    ...
}

以下是主要方法:

public class SinglyLinkedList {
    public static void main(String[] args) {
        SinglyLinkedList test = new SinglyLinkedList();

        test.insert(1, 0); // insert(data, position)
        test.insert(2, 1);
        test.insert(3, 2);
        test.insert(4, 1);
        test.purge();
        test.printList(); // Still prints elements!
    }
}

所以插入后,列表是:1-> 4 - > 2 - > 3,但方法purge()不删除元素 - 方法printList()仍然打印链表中的值。但我可以清除链接列表,如:

public void new_purge() {
    headNode = null;
}

但是purge()方法看起来没有问题..可能它缺乏Java理解,但为什么方法purge()在这里不起作用?

4 个答案:

答案 0 :(得分:2)

基本上,问题是你覆盖了iterator指针而不是节点的指针。实际上,您根本不会影响您的节点。

你的new_purge方法实际上应该工作,实际上要快得多(~n而不是~2n)。

答案 1 :(得分:2)

清除方法中的小错误。

 public void purge() {
    SLLNode nextNode, iterator = headNode;

    while(iterator != null) {
        nextNode = iterator.getNext();
        // iterator = null; -- does nothing.
        iterator.setNext(null); // You want to remove the pointer on the next element
        iterator = nextNode;
    }
    headNode = null; // Remember to clear also your head pointer.
}

但是你应该在JAVA api中使用LinkedList。

答案 2 :(得分:2)

问题是您将headNode分配给局部变量SLLNode nextNode, iterator = headNode;,然后将其设置为null,但您的全局(类实例)变量headNode不受影响。

作为一个副节点,在Java中,在垃圾收集器释放内存的情况下,您不必担心手动内存管理。假设节点由链表类内部处理,将head设置为null就足够了。

答案 3 :(得分:0)

首先,方法 purge()对于内存可能更有效。它是:

public class LinkedList {
    ...
    public void purge() {
        SLLNode iterator = headNode;

        while(iterator != null) {
            iterator = null;
            iterator = iterator.getNext();
        }
    }
    ...
}

您可以删除变量 nextNode 。你可以发布你的方法插入吗?

相关问题