插入java中的双循环链表

时间:2011-03-26 21:23:07

标签: 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

    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方法中,我的指针必须指向错误的节点,但我无法弄清楚我做错了什么。

很抱歉这个很长的问题,希望有足够的信息帮助我! 提前谢谢!

4 个答案:

答案 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值的新构造函数来解决这个问题。引用自己或手动设置prevnext

这是构造函数解决方案:

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