我正在学习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()在这里不起作用?
答案 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 。你可以发布你的方法插入吗?