【问题标题】:DoublyLinkedList Confusion双链表混淆
【发布时间】:2016-06-27 03:04:28
【问题描述】:

我对下面的段代码有点困惑,假设我们已经有一个双链表head->tail;

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
}

我正在尝试追踪代码

line1: 头->节点; head->tail(原始列表)

line2: 头->节点->尾; head->tail(原始列表)

第 3 行:????

第 4 行:????

我看不懂第3行和第4行,执行第1行和第2行后,有两个双链表(一个是原来的双链表,另一个是新创建的)?第 3 行指的是哪个头?

【问题讨论】:

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


    【解决方案1】:

    假设最初头和尾是双向链表中仅有的两个节点,下面是发生了什么......在ascii艺术中!

    通话前:

                      +--------+
                      |    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     | <-+
    |   +--------+        +--------+        +--------+   |
    |                                                    |
    +----------------------------------------------------+
    

    【讨论】:

      【解决方案2】:

      第 3 行是说列表中的第一项应该具有新的最后一项的先前值。

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

          双向链表的初始状态;

          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 = 节点;

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

          第四行

          head.post = 节点;

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

          希望对你有帮助。

          【讨论】:

            猜你喜欢
            • 2016-06-28
            • 1970-01-01
            • 1970-01-01
            • 2016-03-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-11-08
            相关资源
            最近更新 更多