[英]Have i miswired when trying to insert a new node at the middle of doubly linked list?
結構看起來像:
class DList{
private:
struct Elem {
Elem *prev, *next;
};
Elem *_head, *_tail;
}
現在,我有兩個現有節點:cur和cur-> next,我想在它們之間插入一個新節點。 這是我所做的:
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。 我在插入部分弄了東西嗎? (一旦我在上面的中間代碼處注釋了插入,循環就可以正常工作了)
是的,這里接線錯誤。 讓我們畫畫吧!
想象一下,最初的樣子是這樣的:
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
跟蹤curr->next
指向的單元格,因此您失去了在正確位置查看的能力。
如果您從寫這樣的東西開始怎么辦?
DList* next = curr->next;
然后在某些情況curr->next
使用next
而不是curr->next
?
關鍵是不要丟失以后將要使用的值。 您的第一行代碼cur->next = ins;
使您失去原始值(cur->next)
; 此后,您真的不知道ins
next
會是誰。
使用此邏輯在中間插入一個新節點。 首先說,
cur - cur->next
|
[ins]
做,
ins->next = cur->next;
(cur)(ins)-(cur-> next) {假設-代表下一個,= =代表下一個和上一個}
cur->next = ins;
(cur)-(ins)-(cur->下一個)
ins->prev = cur;
cur = ins-(下一步->下一個)
ins->next->prev = ins;
cur = ins =(cur->下一個)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.