首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我试图在双链接列表的中间插入一个新节点时,我是否丢失了连接?

当我试图在双链接列表的中间插入一个新节点时,我是否丢失了连接?
EN

Stack Overflow用户
提问于 2017-10-09 02:40:35
回答 2查看 54关注 0票数 1

结构如下:

代码语言:javascript
复制
class DList{
private:
        struct Elem {
        Elem *prev, *next;
        };
        Elem *_head, *_tail;
}

现在我有两个现有的节点: cur和cur->next,我想在它们之间插入一个新的节点ins。我所做的是:

代码语言:javascript
复制
    cur->next = ins;//step-1-1 cur
    ins->prev = cur;//step-1-2 cur

    ins->next = cur->next;//step-2-1 cur->next
    cur->next->prev = ins;//step-2-2 cur->next 

问题是在我的程序的进一步遍历循环中,我的指针不能再到达_tail。我的插入部分有什么问题吗?(当我在上面的中间代码中注释插入时,循环工作得很好)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-09 02:53:33

是的,这里线路有问题。我们画画吧!

想象一下,最初的事情是这样的:

代码语言:javascript
复制
             curr
              |
              v
         +----------+                         +----------+
         |   next   | ----------------------> |   next   | --> ...
         +----------+                         +----------+
 ... <-- |   prev   | <---------------------- |   prev   | <-- ...
         +----------+                         +----------+
                           +----------+
                           |   next   |
                           +----------+
                           |   prev   |
                           +----------+
                                ^
                                |
                                ins

首先,执行cur->next = ins;,它执行以下操作:

代码语言:javascript
复制
             curr
              |
              v
         +----------+                         +----------+
         |   next   | -----------+            |   next   | --> ...
         +----------+            |            +----------+
 ... <-- |   prev   | <----------+----------- |   prev   | <-- ...
         +----------+            v            +----------+
                           +----------+
                           |   next   |
                           +----------+
                           |   prev   |
                           +----------+
                                ^
                                |
                                ins

注意,我们不再有指向最初在curr - oops之后的元素的指针了!以后就会有问题了。

现在,我们来做ins->prev = curr;,它看起来如下:

代码语言:javascript
复制
             curr
              |
              v
         +----------+                         +----------+
         |   next   | -----------+            |   next   | --> ...
         +----------+            |            +----------+
 ... <-- |   prev   | <----------+----------- |   prev   | <-- ...
         +----------+            v            +----------+
               ^           +----------+
               |           |   next   |
               |           +----------+
               +---------- |   prev   |
                           +----------+
                                ^
                                |
                                ins

现在,我们编写ins->next = curr->next;。但是哎呀!注意,curr->next指向ins,因此我们在这里添加了一个循环:

代码语言:javascript
复制
             curr
              |
              v
         +----------+                         +----------+
         |   next   | -----------+            |   next   | --> ...
         +----------+            |            +----------+
 ... <-- |   prev   | <----------+----------- |   prev   | <-- ...
         +----------+            v            +----------+
               ^           +----------+
               |           |   next   | --+
               |           +----------+   |
               +---------- |   prev   | <-+
                           +----------+
                                ^
                                |
                                ins

最后,您编写了cur->next->prev = ins;,但是oops!curr->next仍然是prev,所以我们得到了另一个循环:

代码语言:javascript
复制
             curr
              |
              v
         +----------+                         +----------+
         |   next   | -----------+            |   next   | --> ...
         +----------+            |            +----------+
 ... <-- |   prev   | <----------+----------- |   prev   | <-- ...
         +----------+            v            +----------+
                           +----------+
                       +-> |   next   | --+
                       |   +----------+   |
                       +-- |   prev   | <-+
                           +----------+
                                ^
                                |
                                ins

这里的问题是,在第一次赋值之后,您丢失了curr->next所指向的单元格的跟踪,因此您失去了查找正确位置的能力。

如果你从写这样的东西开始呢?

代码语言:javascript
复制
DList* next = curr->next;

然后在这些上下文中使用next而不是curr->next

票数 3
EN

Stack Overflow用户

发布于 2017-10-09 02:50:31

关键是不要丢失以后将要使用的值。您的第一行代码cur->next = ins;使您失去了原始值(cur->next);此后,您真的不知道谁将是insnext

使用此逻辑在中间插入一个新节点。我们一开始说,

代码语言:javascript
复制
cur - cur->next  
    |
  [ins]

做,

代码语言:javascript
复制
ins->next = cur->next;

(cur) (ins) - (cur-> next ) { next和=next和prev}

代码语言:javascript
复制
cur->next = ins;

(cur) - (ins) - (cur->next)

代码语言:javascript
复制
ins->prev = cur;

cur = ins - (cur->next)

代码语言:javascript
复制
ins->next->prev = ins;

cur = ins = (cur->next)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46638127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档