數據結構與算法篇 鏈表

1 什麼是鏈表?

 

數組是需要一塊連續的內存,但是鏈表不需要,它可以通過“指針”把一串零散的內存串聯起來使用,鏈表的常見結構有:單鏈表,雙鏈表,循環單鏈表,循環雙鏈表。
 
2 經典的鏈表應用場景有那些?
緩存技術,緩存技術在軟件開發中是非常常見的,cpu 緩存,數據庫緩存,瀏覽器緩存等等。
緩存大小有限,當緩存被用滿時,那些數據應該被清理,那些數據應該保留下來?
常見的淘汰策略有三種:先進先出FIFO(First in First out),最少使用策略LFU(Least Frequently Used),最近最少使用策略(Least Recently Used)。
 
3 鏈表的插入\刪除與查找操作?
首先說一下單鏈表和單循環鏈表的插入\刪除的時間複雜度都是O(1)(這只是理論值,實際中我們要插入/刪除操作,我們必須要找到這個數據),由於它的地址不是連續的,所以不同搬移數據,但是正因爲這樣導致了查找數據需要遍歷k位才能找到第k個數據,所以查找的時間複雜度是O(n)。
再說說雙向鏈表的刪除操作,一般刪除操作有兩種,第一種刪除等於指定值的結點的前一個結點,第二種是刪除給定結點;對於第一種情況無論是哪一種都是需要O(n),第二種情況由於雙向鏈表記錄着前向和後向,所以只需要O(1)的時間複雜度。
至於插入,查找就不說了,同理可得。在實際開發中,根據實際情況使用,看是否需要額外的空間換取時間,在手機或者單片機上就需要考慮用時間換空間的設計思想。
 
4 緩存屬於時間換空間還是空間換時間?
緩存實際上是利用空間換時間的設計思想,如果我們把數據存儲在硬盤上,因爲訪問硬盤比訪問內存慢非常多,從下圖可以看出。但如果我們通過緩存技術,事先把數據加載到內存中,這樣就可以提高每次的數據查詢速度。
 
5 鏈表與數組的性能對比?
很多時候一說起數組和鏈表第一時間想起的就是插入和查找的速度誰快O(1)和O(n)的對比,我們不能單單從時間的複雜度去分析這個問題。數組是簡單易用,實際上使用的連續的內存空間,可以藉助CPU的緩存機制,預讀數組中的數據,使得訪問效率更高。但是鏈表在內存當中不是連續存儲,所以對CPU緩存不友好,無法有效預讀。
數組無法動態擴容,需要整個數組搬移,申請更大的空間,鏈表天生支持動態擴容。
如果你的代碼對內存的使用非常苛刻,那數組更適合你。
 
6 插入和刪除操作需要注意什麼?
插入:避免在指針賦值的過程中出現指針丟失
刪除:在最後的時候記得釋放內存空間,避免內存泄漏
 
7 帶頭結點的好處?
不帶頭結點的單鏈表對於第一個節點的插入操作與最後一個結點的刪除操作其他節點不一樣,需要特殊處理,這增加了程序的複雜性和出現bug的機會,因此,通常在單鏈表的開始結點之前附設一個頭結點。
 
8 需要注意那些邊界條件
鏈表爲空時是否能正常操作?
只包含一個結點?
兩個結點?
處理頭尾結點時?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章