Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中双循环链表的插入_Java_Pointers_Hyperlink_Linked List - Fatal编程技术网

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