java中双循环链表的插入
对于家庭作业,我应该使用节点和指针创建一个循环链表。java中双循环链表的插入,java,pointers,hyperlink,linked-list,Java,Pointers,Hyperlink,Linked List,对于家庭作业,我应该使用节点和指针创建一个循环链表。 这是我的节点类 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 publi
这是我的节点类
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方法,因为当我运行此代码(主代码)时,我的输出不是预期的: 我得到的结果是:泰勒简泰勒简。。。重复。
我希望输出是:Steve Kuba Taylor Jane Steve Kuba Taylor Jane…重复 这就是为什么我认为问题出在insert方法中,我的指针一定指向了错误的节点,但我就是不知道我做错了什么 很抱歉问了这么长的问题,希望有足够的信息让你帮助我!
提前谢谢 插入方法中确实存在问题:
list.next.prev = list;
list.next.next = list;
有什么东西看起来不对称吗
不相关,但请思考以下问题:list
是否可以null
?应该是吗?替换此:
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);
在这种情况下,传递给构造函数的列表
参数都是null
,您应该通过创建一个只接受字符串
值然后引用自身的新构造函数,或者通过手动设置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;
}}
插入的这一部分看起来不正确
} else {
list = new Node(list.prev, s, list);
list.next.prev = list;
list.next.next = list;
最后一行应该是:
list.prev.next = list
<> >仔细查看<代码> <代码>插入> <代码>函数,并考虑是否真的要设置<代码>列表。Next。Next=List< < /C> > /< P>这看起来像一个双链接列表BWTYES,我忘了指定,谢谢ARGOTETEX,我看到了我做错了什么……但在切换之后,我得到了一个nullpointerExceptionline@Cheesegraterr:可能是您正在为列表创建一个新列表,该列表失去了对以前存在的列表的引用,请参阅my edit.hmmm我也尝试了,但仍然在list.next.prev=tmpList处获得一个空指针;哇,真是个愚蠢的错误!谢谢你的帮助。它起作用了!没问题,只要知道这样一行中的参数在分配之前是通过的。
list.prev.next = list