鍊錶是按線性單向序列排列的值的集合。與swift語言裡array等連續儲存資料結構相比,鍊錶在理論上具有兩個優勢:
如圖所示,鍊錶是乙個節點鏈。節點有兩個職責:
節點(node)
public class node
}extension node: customstringconvertible
return "(value) -> " + string(describing: next) + " "}}
導航到playground頁面並新增以下內容:
example(of: "creating and linking nodes")
上邊的**其實就是讓你建立了三個節點並將它們連線起來:
在控制台中,您應該看到以下輸出:
---example of creating and linking nodes---
1 -> 2 -> 3
就實用性而言,當前構建列表的方法還有很多不盡如人意的地方。您可以很容易地看到,以這種方式構建長列表是不切實際的。解決此問題的一種常見方法是構建管理node物件的linkedlist。讓我們繼續。
鍊錶(linkedlist)
在sources目錄中,建立乙個新檔案並將其命名為linkedlist.swift。將以下內容新增到檔案中:
public struct linkedlist
public var isempty: bool
}extension linkedlist: customstringconvertible
return string(describing: head)}}
鍊錶具有頭部和尾部的概念,分別指鍊錶的第乙個和最後乙個節點:
新增資料到列表中
push
在鍊錶前面新增值稱為push操作。這也稱為頭部優先插入。它的**非常簡單。 將以下方法新增到linkedlist:
public mutating func push(_ value: value)
}
在push空鍊錶的情況下,新節點既是鍊錶的頭部,也是鍊錶的尾部。 返回playground頁面並新增以下內容:
example(of: "push")
你的控制台輸出應顯示以下內容:
---example of push---
1 -> 2 -> 3
guard !isempty else
tail!.next = node(value: value)
tail = tail!.next}
跳回playground,在底部寫下以下內容:
var list = linkedlist()
print(list)}
你在控制台中看到以下輸出:
1 -> 2 -> 3
insert(after:)
新增值的第三個也是最後乙個操作是insert(after:)。
public func node(at index: int) -> node?
return currentnode
}
node(at:)將嘗試根據給定索引檢索列表中的節點。由於只能從head節點訪問列表的節點,因此必須進行迭代遍歷。以下是步驟: 1. 建立乙個新的head引用,並跟蹤當前遍歷的數量。 2. 使用while迴圈,你可以在列表中向下移動引用,直到達到所需的索引。空列表或超出界限的索引將導致nil返回值。
現在需要插入新節點。 在node(at:)正下方新增以下方法:
// 1
@discardableresult
public mutating func insert(_ value: value, after node: node) -> node
// 3
node.next = node(value: value, next: node.next)
return node.next!
}
以下是你所做的事情:
@discardableresult允許呼叫者忽略此方法的返回值,而編譯器不會上下跳警告你。
否則,只需將新節點與列表的其餘部分鏈結起來,然後返回新節點。
跳回playground頁面測試上述。將以下內容新增到playground底部:
example(of: "inserting at a particular index")
print("after inserting: (list)")
}
你在控制台中看到以下輸出:
---example of inserting at a particular index---
before inserting: 1 -> 2 -> 3
after inserting: 1 -> 2 -> -1 -> -1 -> -1 -> -1 -> 3
效能分析棒!到目前為止你已經取得了很好的進步。簡單地說,你已經實現了向鏈結列表新增值的三個操作,以及在特定索引處查詢節點的方法。
建立乙個python鍊錶
鍊錶是一種由一系列節點組成的資料結構,每個節點都有指向下個節點的指標。這種結構就不需要連續的記憶體去儲存,但只要找到起始節點 頭節點 整個鍊錶的資料都可以被依次訪問。在python3中,建立鍊錶的過程可以粗略分為定義單節點,定義空鍊錶,向空鍊錶填充資料幾個步驟 來自定義單節點 class node ...
建立乙個鍊錶
不知道為什麼總是忘了對鍊錶的操作,主要就是平時用的少,希望自己通過寫這編文章能加深對鍊錶操作的印象 目錄1.首先得要有兩個基本的標頭檔案 2.再然後得要有個結構體 3.這部分是函式前置宣告 4.鍊錶初始化 5.插入節點 6.列印整個鍊錶 7.釋放整個鍊錶的記憶體 8.整個程式示例 9.列印結果 in...
python3實現鍊錶
a 鍊錶的結構為 b 鍊錶的實現方法 鍊錶結構實現 私有屬性 pro item是指向下個節點的指標,item為此節點的值 class chaindemo def init self,item none,pos item none self.item item self.pos item pos it...