是的,这里有一个接线错误。让我们画画吧!
想象的事情是这样的,首先:
curr
|
v
+----------+ +----------+
| next | ----------------------> | next | --> ...
+----------+ +----------+
... <-- | prev | <---------------------- | prev | <-- ...
+----------+ +----------+
+----------+
| next |
+----------+
| prev |
+----------+
^
|
ins
首先,执行cur->next = ins;
,它将会:
curr
|
v
+----------+ +----------+
| next | -----------+ | next | --> ...
+----------+ | +----------+
... <-- | prev | <----------+----------- | prev | <-- ...
+----------+ v +----------+
+----------+
| next |
+----------+
| prev |
+----------+
^
|
ins
请注意,我们不再有一个指针原是元素curr
之后 - 哎呀!那会在稍后出现问题。现在
,我们做ins->prev = curr;
,它看起来像这样:
curr
|
v
+----------+ +----------+
| next | -----------+ | next | --> ...
+----------+ | +----------+
... <-- | prev | <----------+----------- | prev | <-- ...
+----------+ v +----------+
^ +----------+
| | next |
| +----------+
+---------- | prev |
+----------+
^
|
ins
现在,我们写ins->next = curr->next;
。但哎呀!请注意,curr->next
点ins
,所以我们只是在这里增加了一个循环:
curr
|
v
+----------+ +----------+
| next | -----------+ | next | --> ...
+----------+ | +----------+
... <-- | prev | <----------+----------- | prev | <-- ...
+----------+ v +----------+
^ +----------+
| | next | --+
| +----------+ |
+---------- | prev | <-+
+----------+
^
|
ins
最后,你写cur->next->prev = ins;
但糟糕!curr->next
仍然prev
,所以我们得到一个循环:
curr
|
v
+----------+ +----------+
| next | -----------+ | next | --> ...
+----------+ | +----------+
... <-- | prev | <----------+----------- | prev | <-- ...
+----------+ v +----------+
+----------+
+-> | next | --+
| +----------+ |
+-- | prev | <-+
+----------+
^
|
ins
这里的问题是,你失去跟踪小区的第一次分配后指向由curr->next
,让你失去了在正确的地方看的能力。
如果你从写这样的东西开始呢?
DList* next = curr->next;
然后用next
代替curr->next
在一些情境?
当你做'ins-> next = cur-> next'时,你已经设置了'cur-> next = ins'。所以你最终与'ins-> next == ins' –
@IgorTandetnik步骤2-1设置钩子插入和原始cur->下一个节点,有两个,所以我认为我必须钩两个 –
那么,是的,这就是你的意图 - 但那时你已经失去了指向**原始**'cur-> next'节点的指针。 'cur-> next'不再指向所述原始节点,而是指向'ins'。 –