演算法筆記-連結串列2
阿新 • • 發佈:2018-12-22
如何輕鬆寫出正確的連結串列程式碼
本文創作靈感來源於 極客時間 王爭老師的《資料結構與演算法之美》課程,通過課後反思以及借鑑各位學友的發言總結,現整理出自己的知識架構,以便日後溫故知新,查漏補缺。
理解了連結串列的基礎知識,但是距離寫出正確的連結串列程式碼還是有一段差距的,這個差距就需要我們反覆練習,總結,歸納,再練習。王爭老師提供了以下幾點技巧,幫助我們迅速提高自己寫出正確連結串列程式碼的動手能力。
理解指標或者引用的正確含義
- 在C語言中有著指標的概念。所謂指標,可以理解成是一個特殊的變數,儲存的不是具體的數值,而是記憶體地址。通常所說的指標指向 p ,就是說這個指標儲存的是變數 p 的記憶體地址。在高階語言中,拋棄了指標的概念,轉而用引用這個概念代替指標的作用。
警惕指標丟失和記憶體洩漏
- 連結串列中插入節點的時候,一定要注意指標的指向順序。比如在 a ,b兩個節點之間插入節點 n ,指標丟失的寫法就是:a->next = n,n->next = a->next。再插入節點之前,a->next = b,但是按照上面的寫法,直接a->next = n。這樣直接導致連結串列失去了訪問節點 b 記憶體地址的指標,n 節點後面無法跟上 b 節點,這就導致了指標丟失。
- 在連結串列中刪除節點的時候,一定要注意記憶體的釋放。比如在 a,n,b三個節點中刪除節點 n,記憶體洩漏的寫法就是:a->next = n->next。這樣,a 節點的後繼指標指向了 b 節點,但是沒有執行 n->next = null,就導致了刪除節點依然指向 b 節點的記憶體地址,是的記憶體洩漏。
利用哨兵簡化實現難度
- 引入哨兵的概念,簡化程式碼的實行過程。王爭老師舉了一個例子:遍歷一個數組,我們找出值等於 5 的元素的下標。常規寫法,我們會利用for迴圈遍歷陣列,然後針對每一次迴圈都做一次當前元素是否等於 5 。當我們引入哨兵的概念時,獲取陣列最後一個元素,先做一次判斷是否等於 5 ,如果不等於 5 ,我們建立一個變數(哨兵變數),該變數儲存陣列最後一個元素的值,另陣列的最後一個元素值為 5 。對陣列遍歷,使用 while 迴圈,迴圈條件就是當前陣列元素不等於 5 ,這樣迴圈內部就少了一次值得對比,簡化了程式碼操作。
- 程式碼如下
int [] list = new int[10];
int node = list[10];
if(node == 5){
return -1;
}
list[10] = 5;
int i = 0;
while(list[i] != 5){
i++;
}
list[10] = node;
return i;
重點留意邊界條件處理
- 當我們在處理集合的時候,往往編碼以及測試的情況都是集合中是有足夠的元素的。但是這並不代表集合中沒有元素,只有一個元素等等特殊情況下,程式碼邏輯依然正確,所以這就需要我們留意觀察邊界條件。王老師給出了一下幾種情況我們需要格外留意
- 連結串列為空
- 連結串列只包含一個節點
- 連結串列只包含兩個節點
- 連結串列操作的是頭結點和尾節點
距離畫圖,輔助思考
- 好記性不如爛筆頭,當我們處理的業務邏輯比較複雜,完全可以接藉助畫圖幫助我們具象化抽象的思維邏輯。
總結
初入演算法學習,必是步履蹣跚,一路磕磕絆絆跌跌撞撞。看不懂別慌,也別忙著總結,先讀五遍文章先,無他,唯手熟爾~
與諸君共勉