您好,登錄后才能下訂單哦!
這篇“c語言鏈表如何實現”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“c語言鏈表如何實現”文章吧。
在計算機領域離不開算法和數據結構,而在數據結構中我們往往需要一些靈巧的結構去處理一些繁雜的數據,鏈表 就是這樣一種能穿針引線般的幫助我們去解決這種問題的數據結構。
它可以輔助組成其他數據結構比如 隊列 。
后續的比如二分搜索樹,平衡二叉樹,紅黑樹等動態數據結構都可以在理解鏈表的基礎上進行深入的學習。
如果你是一個計算機初學者,那么對于鏈表的學習可以幫助你理解 遞歸 ,因為后續的二叉樹中需要深入理解 遞歸 。
在《算法(第4版)》中,對鏈表的定義如下:
鏈表是一種遞歸的數據結構,它或者為空(null),或者是指向一個結點(node)的引用,該節點還有一個元素和一個指向另一條鏈表的引用。
鏈表的數據存儲在“節點”(Node)中:
resize 這個操作,而通過觀察鏈表的數據結構可以發現:
最后一個節點的 next 指向 NULL ,這個節點是最后一個節點
不像數組一下子必須new出來一片空間,無需考慮空間不夠用或浪費
需要多少個數據,就能生成多少個節點掛接起來
也就是說:鏈表具有動態的能力,不需要去處理固定容量的問題。
正因為鏈表具備這種動態能力,那它也就缺失了高效的random access(隨機訪問)的能力。它無法與數組一樣,通過一個索引(index)直接獲取對應的元素。
因為在底層機制中數組開辟的空間在內存中是連續分布的,我們可以直接尋找索引對應的偏移,直接計算出數據所存儲的內存地址,直接用O(1)復雜度拿出。
鏈表靠next連接,每個節點存儲地址不同,我們只能通過next順藤摸瓜找到我們要找的元素。
這些就是鏈表的成員變量以及常用方法。
對于鏈表這種數據結構而言,在鏈表頭或者鏈尾添加元素都非常方便。
將元素插入鏈表的中間位置也十分簡單,不過得注意插入的順序
Node insertNode = new Node(e); insertNode.next = prevNode.next; prevNode.next = insertNode;
對比兩組動畫后,聰明的你很快就會想:能否用同樣的代碼來處理鏈表的插入頭部和插入中間的操作呢?
答案是肯定的!只需要引入虛擬的頭結點的概念就行了。
那么就可以得到鏈表的添加元素的代碼:
對于鏈表的刪除元素操作,需要找到目標節點的前驅節點。
prev.next = delNode.next delNode.next = null
虛擬節點所在的位置索引可以視為 -1
基于上面 鏈表的查找元素操作 很容易寫出 鏈表的修改元素操作
接口 | 說明 | 復雜度 |
---|---|---|
add(index, e) | 插入操作 | O(n) |
remove(index, e) | 刪除操作 | O(n) |
set(index, e) | 修改操作 | O(n) |
get(index, e) | 查找操作 | O(n) |
contains(index, e) | 也是查找操作 | O(n) |
正因為鏈表沒有索引,因此鏈表喪失了像數組那樣快速訪問的能力,這也就讓鏈表的增刪改查全都是O(n)級別的。
以上就是關于“c語言鏈表如何實現”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。