对于家庭作业,我应该使用节点和指针创建循环链接列表 这是我的节点类
class Node implements Serializable {
public String theName; //the wrapped name
public Node next; //the next node in the sequence
public Node prev; //the previous node in the sequence
public Node(Node p, String s, Node n){
prev = p;
theName = s;
next = n;
}
}
我试图在列表的前面插入字符串(名称),然后使用遍历方法将它们打印出来。
到目前为止,这些是我的遍历和插入方法......
public class ListImpl /*implements List*/ {
Node list;
public ListImpl() {
list = new Node(list, null, list);
}
public void insert(String s) {
if (list == null) {
list = new Node(list, s, list);
} else {
list = new Node(list.prev, s, list);
list.next.prev = list;
list.next.next = list;
}
}
public void traverse(ASCIIDisplayer out) {
Node p = new Node(null, null, null);
p = list;
if (list != null) {
while(true) {
out.writeString(p.theName);
p = p.next;
}
} else {
throw new EmptyListException();
}
}
}
我知道我的遍历方法将是一个连续的循环,我必须弄清楚当它回到列表的开头时如何停止它,但这不是我的问题。
我相信我的问题在于insert方法,因为当我运行此代码(主要)时,我的输出不是预期的:
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
ASCIIDisplayer a = new ASCIIDisplayer();
ListImpl List;
List = new ListImpl();
List.insert("Steve");
List.insert("Kuba");
List.insert("Taylor");
List.insert("Jane");
List.traverse(a);
}
}
我得到的输出是:Taylor Jane Taylor Jane Taylor Jane Taylor Jane ...重复 我预计输出会是:史蒂夫库巴泰勒简史蒂夫库巴泰勒简......重复。
这就是为什么我认为问题出在insert方法中,我的指针必须指向错误的节点,但我无法弄清楚我做错了什么。
很抱歉这个很长的问题,希望有足够的信息帮助我! 提前谢谢!
答案 0 :(得分:2)
替换它:
list = new Node(list.prev, s, list);
list.next.prev = list;
list.next.next = list;
用这个:
Node tmpList = new Node(list.prev, s, list);
list.next.prev = tmpList;
list.prev.next = tmpList;
list = tmpList;
至于确定何时重复一个节点,你可以通过保存第一个节点并比较它是否与下一个节点相同来实现,当发生这种情况时,你就到达了列表的末尾。
此外,当您插入第一个节点时,您执行此操作:
if (list == null) {
list = new Node(list, s, list);
在这种情况下,传递给构造函数的list
个参数都是null
,你应该通过创建一个只接受String
值的新构造函数来解决这个问题。引用自己或手动设置prev
和next
。
这是构造函数解决方案:
class Node implements Serializable {
public String theName; //the wrapped name
public Node next; //the next node in the sequence
public Node prev; //the previous node in the sequence
public Node(Node p, String s, Node n){
prev = p;
theName = s;
next = n;
}
public Node(String s){
prev = this;
theName = s;
next = this;
}}
答案 1 :(得分:0)
您的插入方法确实存在问题:
list.next.prev = list;
list.next.next = list;
那里看起来像什么?
无关,但请考虑以下问题:list
可以null
吗?应该是吗?
答案 2 :(得分:0)
插入的这部分看起来不正确
} else {
list = new Node(list.prev, s, list);
list.next.prev = list;
list.next.next = list;
最后一行应该是:
list.prev.next = list
答案 3 :(得分:0)
仔细查看else
函数中的insert
分支,并考虑是否确实要设置list.next.next=list
。