循环双链表Java - 解释

时间:2018-06-11 12:45:39

标签: java doubly-linked-list

目前,我正在编写一个循环的双向链表,我的任务已经完成,但我在理解代码100%时遇到了一些问题。

这是代码:

if (counter == 0) {
        startpoint = newNode;
        startpoint.next = startpoint;
        startpoint.prev = startpoint;
        head = startpoint;
        currentNode = newNode;

    } else {
        newNode.prev = startpoint.prev;
        newNode.next = startpoint;
        startpoint.prev.next = newNode; <- this is, where I have problems
        startpoint.prev = newNode;
        head = startpoint;
        currentNode = newNode;
    }
    counter++;
}

第一部分是完全清晰的,只是描述了当调用next或first-method时,第一个节点(如果没有其他节点)将指向自身。在else语句之后,第一行描述第一个节点可以指向第二个节点,第二个节点指向前一个节点,对吗? 其他第二行刚刚描述,最后一个节点指向第一个节点。第四行描述,如果调用prev方法,则第一个节点指向最后一个节点,因此圆圈关闭。但第三行究竟描述了什么?代码肯定有用。

感谢您的时间!

电贺 多米尼克

2 个答案:

答案 0 :(得分:1)

您的清单是通告。

startpoint.prev是起始点之前的元素,因此它是列表的最后一个元素。

我们举个例子,这是您的列表:A>B>C,您尝试添加D

这一行:startpoint.prev.next = newNode;会将当前的最后一个元素(C作为A.prev == C)链接到您的新元素。 (C.next = D

此行startpoint.prev = newNode;会将新元素设置为列表的最后一个元素(A.prev = D)。

答案 1 :(得分:1)

代码在newNode之前插入startpoint。 else语句的第3行只是在起始点之前更新节点,以便它的next字段引用新节点。

为了更清楚,可以像这样重写一行:

    Node nodeBeforeStarpoint = startpoint.prev;
    nodeBeforeStartpoint.next = newNode;