链表中删除选定结点的优雅操作!
生活随笔
收集整理的這篇文章主要介紹了
链表中删除选定结点的优雅操作!
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一般我們在進行單向鏈表鏈表的結點刪除操作時,都是通過相應的結構體指針進行鏈表的遍歷,然后找
到需要刪除的節點,為了完成刪除操作,我們需要在尋找該節點時,不斷地記錄下這個節點前面的節點
(prev),來保證當特定結點被刪除后,我們還可以將斷開的鏈表重新連起來,下面給出一段偽碼:
remove_list_entry(entry){prev = NULL;walk = head;// Walk the listwhile (walk != entry){prev = walk;walk = walk -> next;} // Remove the entry by updating the // head or the previous entryif (!prev)head = entry->next;elseprev->next = entry->next; }原理如下圖
(該段代碼沒有考慮待刪除節點不在鏈表中的情況)
另外,這段代碼還考慮到一個特殊情況,待刪除的節點不是中間節點,而是頭結點(head).而這段代碼也是大多數學校的老師或者是書上教我們的.
然而,下面的代碼也可以完成同樣的功能(偽碼):
remove_list_entry(entry){// The "indirect" pointer points to the // *address* of the thing we'll updateindirect = &head;// Walk the list, looking for the thing that// poins to the entry we want to remove_list_entrywhile ((*indirect) != entry){indirect = &((*indirect)->next);}// .. and just remove it*indirect = entry -> next;}看到這段代碼我覺得大多數人的第一印象就是很簡潔,很騷(帥),沒有if-else,不管我們需要刪除的頭結點還是中間節點,都可以用相同的邏輯來表達.
而這段代碼使用的就是我們不經常使用的指針的指針,同過它,消除了if-else,消除了previous,使代碼變得更優雅,我喜歡這個詞/cy
關鍵點就是indirect這個指針第一次指向的是head的地址,第二次指向的是節點1.next的地址,第三次指向的是節點2.next的地址.
通過比較,可以知道第一段代碼并不好,它需要第一個節點和中間節點,有特例.
而第二段代碼展示了一種不同的方式,可以把一個特例當成正常情況來處理,這就是好的代碼,優雅的代碼.
總結
以上是生活随笔為你收集整理的链表中删除选定结点的优雅操作!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS练习:商品的左右选择
- 下一篇: 蓝桥杯真题-单词分析