Java 中的双向链表

问题描述 投票:0回答:1

我是 IT 专业的新生,我们做了一个关于链表的测验,其中一个问题基本上是重新排列双向链接图。

我得到的答案是“agortihm”,但它被认为是不正确的。a picture of the question with instructions and the correct answer。我已经研究了两个小时了,但我仍然不明白他们是如何得出正确答案的。我不断地找到“agotihm”作为答案。任何帮助将不胜感激,谢谢!

java doubly-linked-list
1个回答
0
投票

前六个语句将节点“i”移动到节点“t”之后。我们从:

开始
               p1                          p2     p3
               ↓                           ↓      ↓
      ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐
list─►││a│┼─►││l│┼─►││g│┼─►││o│┼─►││r│┼─►││i│┼─►││t│┼─►││h│┼─►││m│┼─►Ω
   Ω◄─┼│ ││◄─┼│ ││◄─┼│ ││◄─┼│ ││◄─┼│ ││◄─┼│ ││◄─┼│ ││◄─┼│ ││◄─┼│ ││
      └┴─┴┘  └┴─┴┘  └┴─┴┘  └┴─┴┘  └┴─┴┘  └┴─┴┘  └┴─┴┘  └┴─┴┘  └┴─┴┘

(a)之后

p2.next.prev = p2.prev;

               p1                          p2     p3
               ↓                           ↓      ↓
      ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐
list─►││a│┼─►││l│┼─►││g│┼─►││o│┼─►││r│┼─►││i│┼─►││t│┼─►││h│┼─►││m│┼─►Ω
   Ω◄─┼│ ││◄─┼│ ││◄─┼│ ││◄─┼│ ││◄─┼│ ││◄─┼│ ││ ┌┼│ ││◄─┼│ ││◄─┼│ ││
      └┴─┴┘  └┴─┴┘  └┴─┴┘  └┴─┴┘  └┴─┴┘  └┴─┴┘ │└┴─┴┘  └┴─┴┘  └┴─┴┘
                                    ▲          │
                                    └──────────┘  

(b)之后

p2.prev.next = p2.next;

                                           p2     p3
               p1                      ┌──────────┐
               ↓                       │   ↓      ▼
      ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐│ ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐
list─►││a│┼─►││l│┼─►││g│┼─►││o│┼─►││r│┼┘ ││i│┼─►││t│┼─►││h│┼─►││m│┼─►Ω
   Ω◄─┼│ ││◄─┼│ ││◄─┼│ ││◄─┼│ ││◄─┼│ ││◄─┼│ ││ ┌┼│ ││◄─┼│ ││◄─┼│ ││
      └┴─┴┘  └┴─┴┘  └┴─┴┘  └┴─┴┘  └┴─┴┘  └┴─┴┘ │└┴─┴┘  └┴─┴┘  └┴─┴┘
                                    ▲          │
                                    └──────────┘  

(c)之后

p2.next = p3.next;

                                                  p3
                                       ┌──────────┐
               p1                      │   p2 ┌───│──────┐
               ↓                       │   ↓  │   ▼      ▼
      ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐│ ┌┬─┬┐│ ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐
list─►││a│┼─►││l│┼─►││g│┼─►││o│┼─►││r│┼┘ ││i│┼┘ ││t│┼─►││h│┼─►││m│┼─►Ω
   Ω◄─┼│ ││◄─┼│ ││◄─┼│ ││◄─┼│ ││◄─┼│ ││◄─┼│ ││ ┌┼│ ││◄─┼│ ││◄─┼│ ││
      └┴─┴┘  └┴─┴┘  └┴─┴┘  └┴─┴┘  └┴─┴┘  └┴─┴┘ │└┴─┴┘  └┴─┴┘  └┴─┴┘
                                    ▲          │
                                    └──────────┘  

(d)之后

p3.next.prev = p2;

                                                  p3
                                       ┌──────────┐
               p1                      │   p2 ┌───│──────┐
               ↓                       │   ↓  │   ▼      ▼
      ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐│ ┌┬─┬┐│ ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐
list─►││a│┼─►││l│┼─►││g│┼─►││o│┼─►││r│┼┘ ││i│┼┘ ││t│┼─►││h│┼─►││m│┼─►Ω
   Ω◄─┼│ ││◄─┼│ ││◄─┼│ ││◄─┼│ ││◄─┼│ ││◄─┼│ ││ ┌┼│ ││ ┌┼│ ││◄─┼│ ││
      └┴─┴┘  └┴─┴┘  └┴─┴┘  └┴─┴┘  └┴─┴┘  └┴─┴┘ │└┴─┴┘ │└┴─┴┘  └┴─┴┘
                                    ▲      ▲   │      │
                                    │      └───│──────┘
                                    └──────────┘  

(e)之后

p3.next = p2;

                                           p2     p3
                                           ┌─────────┐
                                       ┌──────────┐  │
               p1                      │   │  ┌───│──────┐
               ↓                       │   ▼  │   ▼  │   ▼
      ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐│ ┌┬─┬┐│ ┌┬─┬┐│ ┌┬─┬┐  ┌┬─┬┐
list─►││a│┼─►││l│┼─►││g│┼─►││o│┼─►││r│┼┘ ││i│┼┘ ││t│┼┘ ││h│┼─►││m│┼─►Ω
   Ω◄─┼│ ││◄─┼│ ││◄─┼│ ││◄─┼│ ││◄─┼│ ││◄─┼│ ││ ┌┼│ ││ ┌┼│ ││◄─┼│ ││
      └┴─┴┘  └┴─┴┘  └┴─┴┘  └┴─┴┘  └┴─┴┘  └┴─┴┘ │└┴─┴┘ │└┴─┴┘  └┴─┴┘
                                    ▲      ▲   │      │
                                    │      └───│──────┘
                                    └──────────┘  

(f)之后

p2.prev = p3;

                                           p2     p3
                                           ┌─────────┐
                                       ┌──────────┐  │
               p1                      │   │  ┌───│──────┐
               ↓                       │   ▼  │   ▼  │   ▼
      ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐│ ┌┬─┬┐│ ┌┬─┬┐│ ┌┬─┬┐  ┌┬─┬┐
list─►││a│┼─►││l│┼─►││g│┼─►││o│┼─►││r│┼┘ ││i│┼┘ ││t│┼┘ ││h│┼─►││m│┼─►Ω
   Ω◄─┼│ ││◄─┼│ ││◄─┼│ ││◄─┼│ ││◄─┼│ ││ ┌┼│ ││ ┌┼│ ││ ┌┼│ ││◄─┼│ ││
      └┴─┴┘  └┴─┴┘  └┴─┴┘  └┴─┴┘  └┴─┴┘ │└┴─┴┘ │└┴─┴┘ │└┴─┴┘  └┴─┴┘
                                    ▲   │  ▲   │  ▲   │
                                    │   │  └───│──│───┘
                                    └───│──────┘  │
                                        └─────────┘

节点“i”的移动已经完成。当我们将节点“i”描绘在节点“t”的右侧时,我们可以简化上面的绘图。由于这些节点由

p2
p3
引用,因此这些节点也会随之移动:

               p1                          p3     p2
               ↓                           ↓      ↓
      ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐
list─►││a│┼─►││l│┼─►││g│┼─►││o│┼─►││r│┼─►││t│┼─►││i│┼─►││h│┼─►││m│┼─►Ω
   Ω◄─┼│ ││◄─┼│ ││◄─┼│ ││◄─┼│ ││◄─┼│ ││◄─┼│ ││◄─┼│ ││◄─┼│ ││◄─┼│ ││
      └┴─┴┘  └┴─┴┘  └┴─┴┘  └┴─┴┘  └┴─┴┘  └┴─┴┘  └┴─┴┘  └┴─┴┘  └┴─┴┘

接下来的语句不会更改任何内容,因为它们分配目标属性在分配发生之前已经拥有的引用:

list.next.next = p1.next;
p1.next.prev = list.next;

最后一个赋值

p1 = null;
仅影响变量,而不影响列表:

               p1→Ω                        p3     p2
                                           ↓      ↓
      ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐  ┌┬─┬┐
list─►││a│┼─►││l│┼─►││g│┼─►││o│┼─►││r│┼─►││t│┼─►││i│┼─►││h│┼─►││m│┼─►Ω
   Ω◄─┼│ ││◄─┼│ ││◄─┼│ ││◄─┼│ ││◄─┼│ ││◄─┼│ ││◄─┼│ ││◄─┼│ ││◄─┼│ ││
      └┴─┴┘  └┴─┴┘  └┴─┴┘  └┴─┴┘  └┴─┴┘  └┴─┴┘  └┴─┴┘  └┴─┴┘  └┴─┴┘

所以结果是:“algortihm”。

© www.soinside.com 2019 - 2024. All rights reserved.