【发布时间】:2015-01-04 16:38:14
【问题描述】:
我读了一本关于“数据结构和算法”的书,其中有一项要求我实现循环链表的作业。这是一个学习练习,我的代码可能不是很高的标准。
我实现循环链表背后的主要思想是有一个指向最后一个元素的指针,每次我添加新项目时,最后一个项目的“下一个”字段将被刷新以指向新的添加项目。
插入方法工作正常,我可以毫无问题地添加项目,但由于某种原因我无法从列表中删除项目。
这里是“链接”或“节点”的代码:
public class Link {
public long data;
public Link next;
public Link(long val) {
data = val;
next = null;
}
public void displayLink() {
System.out.print(data + " ");
}
} // end class
这是执行工作的类的代码,错误显然在这里:
public class CircularList {
Link first;
Link last;
public CircularList() {
first = null;
last = null;
}
public Link find(long key) {
Link current = first;
while(current.data != key) {
current = current.next;
}
return current;
} // end find
public Link delete() {
if(first.next == null)
last = null;
Link temp = first;
first = first.next;
return temp;
} // end delete
public boolean isEmpty() { return (first == null); }
public void insert(long val) {
Link newLink = new Link(val);
if(isEmpty())
last = newLink;
newLink.next = first;
first = newLink;
last.next = first;
} // end insert
public void displayAmount(int n) {
Link current = first;
while(n>0) {
current.displayLink();
current = current.next;
n--;
}
System.out.println("");
} // end displayAmount
} // end class
以及主应用代码:
public class App {
public static void main(String[] args) {
CircularList cl = new CircularList();
cl.insert(10);
cl.insert(20);
cl.insert(30);
cl.insert(40);
cl.displayAmount(6);
cl.delete();
cl.displayAmount(6);
}
} // end class
显示量看起来有点傻,我只是试图避免无限循环并做了一些简单的工作。
【问题讨论】:
-
你的问题是什么?
-
您的链表节点缺少对前一个节点的引用,因此无法删除。您希望最后一个元素引用第一个以及第一个到最后一个,这意味着两者都需要下一个和上一个。有了这些,您可以获取任何元素,获取当前元素的上一个和下一个,并将上一个和下一个连接起来,有效地切割出要删除的元素。
-
@G_V
delete()方法总是(试图)删除第一个元素,这没关系,因为它的前身是last。如果您想删除任意元素,则需要将其进行双重链接,但如果您只删除first,则不需要。 -
这个链接可能对你有帮助sanfoundry.com/…
标签: java data-structures