【问题标题】:Remove all linked list in Java删除Java中的所有链表
【发布时间】:2014-12-26 08:31:44
【问题描述】:

我正在学习 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() 方法在这里不起作用?

【问题讨论】:

  • 为什么定义 LinkedList 但实例化 SinglyLinkedList?
  • @emecas 哎呀这只是复制和粘贴错误哈哈

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


【解决方案1】:

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

作为辅助节点,在 Java 中,您不必担心手动内存管理,因为垃圾收集器会释放内存。假设节点由链表类在内部处理,设置head为null就足够了。

【讨论】:

  • 啊,我明白了!这就是为什么 headNode = null 在 Java 中就足够了。谢谢!
【解决方案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。

【讨论】:

  • 为什么 iterator = null 什么都不做?
  • Java 垃圾收集器 (GC) 删除没有引用的对象。将变量设置为 NULL 不会释放对象。您需要删除指向该对象的引用(在本例中为 iterator.setNext())。然后,GC 会释放内存。
【解决方案3】:

基本上,问题在于您正在覆盖 iterator 指针而不是节点的指针。您实际上根本没有影响您的节点。

您的 new_purge 方法应该确实有效,而且实际上要快得多(~n 而不是~2n)。

【讨论】:

  • 我认为new_purge 也是 O(n):垃圾收集器无论如何都需要删除 n 个对象,即 O(n)。虽然对于这种情况可能会有一次垃圾收集。
  • 好的。好吧,那么它是 ~n 而不是 ~2n(在我极其科学的记数法中)
【解决方案4】:

首先,purge() 方法在内存方面可能更有效。应该是:

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

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

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

【讨论】:

  • 你不能这样做。您在第二条指令上有一个 nullPointerException。
  • 并做一个方法来放置数据,例如 setData(...data) 和一个循环 while iterator not equal null and inside iterator.setData(null) and iterator = iterator.nextNode
猜你喜欢
  • 1970-01-01
  • 2017-07-29
  • 2012-08-18
  • 2022-01-05
  • 1970-01-01
  • 2015-09-21
  • 1970-01-01
相关资源
最近更新 更多