DoublyLinkedList混乱

时间:2016-03-11 18:35:22

标签: java list linked-list nodes doubly-linked-list

我对以下段代码感到有点困惑,假设我们已经有一个双链表头 - >尾部;

class DLinkedNode {
  int key;
  int value;
  DLinkedNode pre;
  DLinkedNode post;
}

/**
 *  Always add the new node right after head;
 */
private void addNode(DLinkedNode node){
  node.pre = head;       // line 1
  node.post = head.post; // line 2
  head.post.pre = node;  // line 3
  head.post = node;      // line 4
}

我尝试跟踪代码

第1行:head->节点; head-> tail(原始列表)

第2行:head-> node-> tail; head-> tail(原始列表)

第3行:????

第4行:????

我无法理解第3行和第4行,在执行第1行和第2行之后,有两个双链表(一个是原始双链表,另一个是新创建的一个)?哪个头是第3行是指?

4 个答案:

答案 0 :(得分:4)

假设头部和尾部最初是双向链表中的两个节点,以下是ascii art中发生的事情!

致电之前:

                  +--------+
                  |    post|
                  |  node  |
                  |pre     |
                  +--------+

+-------------------------------------------+
|                                           |
|                                           |
|   +--------+                 +--------+   |
+-> |    post+---------------> |    post+---+
    |  head  |                 |  tail  |
+---+pre     | <---------------+pre     | <-+
|   +--------+                 +--------+   |
|                                           |
+-------------------------------------------+

第1行:

                  +--------+
                  |    post|
                  |  node  |
       +----------+pre     |
       |          +--------+
       |
+------|------------------------------------+
|      |                                    |
|      v                                    |
|   +--+-----+                 +--------+   |
+-> |    post+---------------> |    post+---+
    |  head  |                 |  tail  |
+---+pre     | <---------------+pre     | <-+
|   +--------+                 +--------+   |
|                                           |
+-------------------------------------------+

第2行:

                  +--------+
                  |    post+---------+
                  |  node  |         |
       +----------+pre     |         |
       |          +--------+         |
       |                             |
+------|-----------------------------|------+
|      |                             |      |
|      v                             v      |
|   +--+-----+                 +-----+--+   |
+-> |    post+---------------> |    post+---+
    |  head  |                 |  tail  |
+---+pre     | <---------------+pre     | <-+
|   +--------+                 +--------+   |
|                                           |
+-------------------------------------------+

第3行:

                  +--------+
                  |    post+---------+
                  |  node  |         |
       +----------+pre     |         |
       |          +------+-+         |
       |                 ^           |
+------|-----------------|-----------|------+
|      |                 |           |      |
|      v                 |           v      |
|   +--+-----+           |     +-----+--+   |
+-> |    post+---------------> |    post+---+
    |  head  |           |     |  tail  |
+---+pre     |           +-----+pre     | <-+
|   +--------+                 +--------+   |
|                                           |
+-------------------------------------------+

第4行:

                  +--------+
                  |    post+---------+
                  |  node  |         |
       +----------+pre     |         |
       |          +-+----+-+         |
       |            ^    ^           |
+------|------------|----|-----------|------+
|      |            |    |           |      |
|      v            |    |           v      |
|   +--+-----+      |    |     +-----+--+   |
+-> |    post+------+    |     |    post+---+
    |  head  |           |     |  tail  |
+---+pre     |           +-----+pre     | <-+
|   +--------+                 +--------+   |
|                                           |
+-------------------------------------------+

最终结果:

+----------------------------------------------------+
|                                                    |
|                                                    |
|   +--------+        +--------+        +--------+   |
+-> |    post+-------->    post+-------->    post+---+
    |  head  |        |  node  |        |  tail  |
+---+pre     <--------+pre     <--------+pre     | <-+
|   +--------+        +--------+        +--------+   |
|                                                    |
+----------------------------------------------------+

答案 1 :(得分:2)

第3行说明列表中的第一项应该具有新上一项的先前值。

第4行说你的旧最后一项实际上应该有一个指向新头的下一个值。

答案 2 :(得分:1)

第3行修改旧的第二个节点(现在是第3个节点)。它将新的第二个节点设置为其上一个节点。

第4行修改头部以将新节点设置为第二个节点。

答案 3 :(得分:1)

双向链表的初始状态;

head -----------------> head.post

在这种情况下,请考虑 head.post 是一个任意节点,新节点将在 head 之后,之前定位(插入) > head.post

headhead.postnode的引用状态会逐渐改变,如下所示;

第一行

node.pre = head;

head <----------------> head.post
head <----------------- node

第二行

node.post = head.post;

head <----------------> head.post
head <----- node -----> head.post

第三行

head.post.pre = node;

head <----- node <----> head.post

第四行

head.post = node;

head <----> node <----> head.post

希望它有所帮助。