關於鏈表中哨兵結點問題的深刻剖析

blog.csdn.net/qq_31903733…

最近正在學習UC Berkeley的CS61B這門課,主要是採用Java語言去實現一些數據結構以及運用數據結構去作一些project。這門課不只告訴你這個東西怎麼作,並且一步一步探尋爲何要這樣作以及爲何會有這些功能。咱們有時在接觸某段代碼或功能的實現時,可能直接就看到了它最終的面貌,而不知道如何一步步演化而來,其實每個功能的添加或優化都是對應一個問題的解決。下面就這門課中關於鏈表中哨兵結點的相關問題進行總結。 什麼是哨兵結點 哨兵顧名思義有巡邏、檢查的功能,在咱們程序中經過增長哨兵結點每每可以簡化邊界條件,從而防止對特殊條件的判斷,使代碼更爲簡便優雅,在鏈表中應用最爲典型。 單鏈表中的哨兵結點 首先討論哨兵結點在單鏈表中的運用,若是不加哨兵結點在進行頭尾刪除和插入時須要進行特殊判斷。好比在尾部插入結點的代碼以下: void addLast(int x) { if (first == null) { first = new Node(x, null); return; } Node p = first; while (p.next != null) { p = p.next; } p.next = new Node(x, null); } 1 2 3 4 5 6 7 8 9 10 11 如上所示須要對結點爲空的特殊狀況進行判斷,頭部加了一個哨兵結點後就能夠不須要判斷了(不會爲空) 雙鏈表中的哨兵結點 Version 1: 雙哨兵 在雙鏈表中須要可以在頭部和尾部分別進行插入刪除操做(能夠實現雙端隊列),爲了能快速在尾部進行插入刪除,須要引入指向尾部的指針。截圖以下(圖片來自CS61B) 上述增長了一個指向尾部的last結點,從上圖能夠看出一個問題,last結點有時指向哨兵結點,有時指向實際結點。這會致使特殊狀況的出現,好比在進行addFirst操做時,last指向哨兵結點時插入後須要將last日後移動一個,而第二張圖指向實際結點時在頭部插入結點後並不須要改變last指針。這時須要在尾部後也引入一個哨兵結點,以使其一致。相應示意圖以下: Version 2:循環雙鏈表 上述Version1須要兩個哨兵結點,能夠對其進行改進。可使用頭部結點的prev指針指向尾部,尾部結點的next指針指向哨兵,這樣就只須要一個哨兵結點,使鏈表變成循環鏈表,比Version1更爲簡潔優雅。 在對如上所示進行插入和刪除操做時必定要格外注意,本身在寫的時候很容易就漏掉某個指針的關係設置,最好在紙上本身畫一遍。(對於要改變的鏈接可能會影響其餘的,這時可將其暫存或最好設置) 在頭部插入的代碼以下: public void addFirst(Item item) { Node node = new Node(item); node.prev = sentinel; node.next = sentinel.next; sentinel.next.prev = node; sentinel.next = node; size++; } 1 2 3 4 5 6 7 8 尾部插入代碼以下: public void addLast(Item item) { Node node = new Node(item); node.prev = sentinel.prev; node.next = sentinel; sentinel.prev.next = node; sentinel.prev = node; size++; } 1 2 3 4 5 6 7 8 頭部刪除代碼以下: public Item removeFirst() { Item item = sentinel.next.item; sentinel.next = sentinel.next.next; sentinel.next.prev = sentinel; size--; return item; } 1 2 3 4 5 6 7 尾部刪除代碼以下 public Item removeLast() { Item item = sentinel.prev.item; Node sl = sentinel.prev.prev; sl.next = sl.next.next; sl.next.prev = sl; size--; return item; } 1 2 3 4 5 6 7 8 總結與感想 (1)雖然看起來很小很簡單的事情,但實現起來卻有不少細小問題能夠考慮,學會把一件小事作的很漂亮。(small but smart) (2)學會分析一個東西的前因後果,爲何會有這部分,以及怎麼改進的。 參考: 1.cs61b:https://joshhug.gitbooks.io/hug61b/content/chap2/chap23.html 2.算法導論10.2鏈表 ———————————————— 版權聲明:本文爲CSDN博主「xinyuexy」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接及本聲明。 原文連接:https://blog.csdn.net/qq_31903733/article/details/82956516
html

相關文章
相關標籤/搜索