繁体   English   中英

java中的双链表法

[英]double linked list method in java

java中双链表的这种方法运行一次while循环然后卡住并且不继续

    public static DoubleLinkedList reverse(DoubleLinkedList DL) {
    DoubleLinkedList result = new DoubleLinkedList();
    Node tempDL = DL.head;
    if(DL.head==null || DL.head.next==null){
        result.head=DL.head;
        result.tail = DL.head;
    }else{
        while(tempDL != null){
            result.insertNode(tempDL.data, 0);
            tempDL = tempDL.next;
        }
    }
    return result;
}

这是插入节点的方法供参考:

public void insertNode(int data, int pos) {
    Node newNode = new Node(data);
    if (head == null)
        head = tail = newNode;
    if (pos > length())
        return;
    if (pos == 0) { // comment #1
        newNode.next = head;
        head.prev = newNode;
        head = newNode;

    } else {
        Node temp = head;
        for (int i = 0; i < pos - 1 && temp.next != null; i++)
            temp = temp.next;

        if (temp.next == null) {
            tail.next = newNode;
            newNode.prev = tail;
            tail = newNode;
        } else {
            newNode.prev = temp;
            newNode.next = temp.next;
            temp.next.prev = newNode;
            temp.next = newNode;
        }
    }
}

正如您在评论 #1 中看到的,这是我在反向方法中调用该方法时起作用的部分

我尝试使新列表 go 的尾部向后,而主列表 go 的头部向前,但随后它自己镜像如下:

主列表:1、2、3、4、5

打电话后:

1, 2, 3, 2, 1

您的insertNode方法创建了一个循环。 当您使用调试器运行代码时,这是非常明显的,单步执行代码......

当列表为空且 pos 为 0 时,执行以下操作:

    if (head == null)
        head = tail = newNode;

到目前为止一切顺利,但这里继续执行:

    if (pos == 0) {
        newNode.next = head;
        head.prev = newNode;
        head = newNode;
    }

这不好:一个循环被创建为 now head.next == head 第一个if应该包括一个return

    if (head == null) {
        head = tail = newNode;
        return;
    }

将长度检查放在 function 的顶部也会更有意义,因此它始终会被执行。 如果为真,则没有理由创建节点实例:

    if (pos > length())
        return;

这不是你的问题,但还有另一点要说明: reverse方法不应从原始列表中创建新列表引用节点,就像第一个if块中发生的那样。 当两个列表之一获得新节点时,这将导致意外行为:然后根据该新节点的 position,另一个列表将具有或不具有它。

所以我建议您删除这种情况,并始终像在一般情况下一样为新列表创建节点:

public static DoubleLinkedList reverse(DoubleLinkedList DL) {
    DoubleLinkedList result = new DoubleLinkedList();
    Node tempDL = DL.head;
    while(tempDL != null){
        result.insertNode(tempDL.data, 0);
        tempDL = tempDL.next;
    }
    return result;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM