作者 | 思秀 責編 | 張文
鍊錶概念的講解
鍊錶是什麼:
鍊錶是一種線性資料結構,每個節點都存有資料,通過指標將各個節點鏈結在一起。
鍊錶的性質:
鍊錶的分類:
ps: **展示只用單鏈表舉例。
單鏈表結構
單鏈表中的每個結點包含資料+指向後繼節點的指標,通過這種方式,單鏈表將所有結點按順序組織起來。
節點定義:
class node(object): """單鏈表結構的node節點""" def __init__(self, data, next_node=none): """node節點的初始化方法。 data:儲存的資料 next:下乙個node節點的引用位址 """ self.data = data self.next = next_node
雙鏈表結構
雙鏈表中的每個節點包含資料+指向前驅和後繼的指標。
鍊錶的基本操作:
鍊錶基本操作: 插入、搜尋、刪除。以下分別講每個操作是如何進行的,時間複雜度多少,為什麼是那麼多,根據時間複雜度判斷鍊錶的適合場景。
查詢
按照索引/值查詢:遍歷找到對應的位置/值,然後返回該節點。
# 按照值查詢node = head_nodewhile node.data != value: node = node.next_node
# 按照索引查詢pos = 0while pos != index: node = node.next_node pos += 1
時間複雜度:是線性遍歷的,所以時間複雜度是 o(n)。因為時間複雜度相對較高,所以在大量資料需要經常用檢索的時候就不要用鍊錶了。
插入
按照 index 插入
先建立新節點 new_node;
找到要插入的位置的前驅節點 pre;
新節點 new_node 指向 pre 的後繼節點;
pre 指向新節點。
new_node.next = pred.nextpred.next = new_node
時間複雜度:由於第2步要線性遍歷去找 index 位置,所以時間複雜度是 o(n)。如果插入在頭部,就不需要找位置,時間複雜度是 o(1)。
刪除
如何做刪除的?
找到待刪節點的前驅 pred;
把它的前驅節點的後繼指向待刪節點後繼的後繼。
pred.next = pred.next.next
時間複雜度:因為要去找前驅,所以線性遍歷,時間複雜度是 o(n)。如果刪除頭部,就不需要找位置,時間複雜度是 o(1)。
鍊錶常見的考點:
啞節點(邊界條件)-用於簡化邊界情況,鍊錶為空或鍊錶的頭結點和尾節點。解決辦法:自己建立乙個啞節點,然後把它的後繼連線原節點。
鍊錶的實際應用,通常用於順序記錄的儲存,無需提前分配空間,僅適用小規模資料儲存。
對於適用的操作屬性來說,鍊錶適合查詢少,無需排序的使用場景,原因:是鍊錶的查詢效率不高,通過調整指標可以快速調節節點的相對位置。
業界應用: 小規模日誌記錄(聯絡歷史或通訊錄),讀到記憶體中後可以以鍊錶的方式進行儲存;作業系統中記憶體快的快取也可以用鍊錶來實現,lru 快取(利用了鍊錶快速調整相對位置優勢)。
模式識別
以下這些適用解決鍊錶相關問題。
runner and chaser 型別遍歷並處理節點: 處理包括交換,改數值,改指標,刪除等等這類問題的處理方式是每次操作都是當前節點或某類節點,每次處理單個或一對節點;處理的時候,先改變前驅指標,再改變當前節點指標,否則當前節點的 next 資訊改變完之後就不對了,通過先改變前驅的指標到達乙個儲存狀態的目的。要動乙個元素的後繼之前,先儲存它的後繼。處理兩個或多個鍊錶處理方式是用 while 迴圈進行常規處理,迴圈條件是 list1 非空並且 list2非空,當迴圈跳出後處理剩下的非空列表。迴圈至空,再處理剩餘。應用遞迴處理(涉及鍊錶倒序處理問題)解決當前問題依賴於存在的相似結構的子問題;利用呼叫函式本身,先解決子問題,再利用子問題的結果解決當前的問題,遞迴的出口通常是問題的初始條件 n=1 的情況。鍊錶問題一旦需要倒序處理或與樹之間的資料結構進行相互轉換往往會用到遞迴,或者用棧來解決。
自己實現乙個單鏈錶類
實現插入查詢刪除的功能。
☞harmonyos 手機應用開發者 beta 版到來,對開發者意味著什麼
☞程式設計師最愛用 emacs 寫 python、bash,調研了 7300 位開發者有這些發現
☞微軟收購 github 兩年後,大咖共論開源新生態
☞紅帽 與 centos 之間的恩怨情仇
☞udp,你要耗子喂汁呀!
☞未來2年,程式設計師如何吊打高學歷工程師?服氣!
點分享點點讚點在看
表單新增多個檔案
其實方法很簡單這樣只能選擇乙個檔案,這樣就可以選擇多個檔案了,怎麼樣,很方便吧。如果不考慮ie的話,可以使用這個方法。關於js自行生成多個input的就算了吧,懶得看,懶的寫,能簡單就簡單吧。對了,還有乙個重要的問題,選擇多個檔案以後,如何用jquery獲取選中的檔案的標題等屬性呢?jquery好像...
wamp新增多個埠 多個站點
1 確保http.conf 開啟了 以下類似的服務 有可能搜尋不到 先不管 2 在http.conf中監聽下面專案可能用到的埠如 listen 8083 listen 8082 3 在conf extra httpd vhosts.conf 中新增配置 servername localhost do...
WampServer新增多個php版本
wampserver可以讓開發者在windows系統下快速搭建wamp環境,它支援多版本的apache mysql php之間的相互切換,互不影響,對於phper開發者來講極為方便快速。以下是在wampserver下同時支援php5.3 php5.4 php5.5 php5.6的步驟 1 安裝wam...