從圖中我們看到,與單鏈表相比,雙向鏈表的每個結點還需要存儲指向前一個結點的指針,所以,同樣多的數據,雙向鏈表比單鏈表需要更多的存儲空間。兩個指針雖然比較浪費空間,但是雙向鏈表可以雙向遍歷,靈活性更高。
雙向鏈表在刪除、插入結點上更加高效,前邊我們講過單鏈表的刪除和插入操作的時間複雜度為O(1),但是雙向鏈表的為什麼會更高效呢,因為單鏈表的分析只是理論上得到的,但是實際情況中是不準確的,是需要前提條件的。下面我們分析一下實際情況中的操作。我們先來看插入操作,實際情況中的插入操作可以分為這兩種情況:
對於第一種情況,不管是單鏈表還是雙向鏈表,都需要從頭一個一個遍歷直到找到特定值的結點,然後執行插入操作雖然插入的時間複雜度為O(1),但是遍歷的時間複雜度為O(n),所以在值等於某個指定值的結點前或者後插入結點的時間複雜度為O(n)。
對於第二種情況,我們通過給定指針可以直到插入結點的位置,但是我們需要直到給定指針的前驅結點,如果是單鏈表,我們依然需要通過從頭開始遍歷找到前驅結點,需要的時間複雜度為O(n),但是對於雙向鏈表就簡單多了,我們只需要通過前驅結點的指針就能得到前驅結點,需要的時間複雜度為O(1)。同理,參照我們上邊插入操作的分析,刪除結點雙向鏈表同樣比單鏈表靈活得多。還有就是在有序鏈表中,雙向鏈表的按值查詢也比單鏈表也快一些,因為我們可以記錄上次查找的位置x,然後通過比較查詢值x的大小來決定向前還是向後,可以比單鏈表節省時間。通過上邊單鏈表和雙向鏈表的比較,我們有學習了靈位一個非常重要的知識點,那就是