簡體   English   中英

嘗試在雙向鏈表的中間插入新節點時是否接線錯誤?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM