使用循環鏈表實現一個通訊錄的管理程序_【LeetCode鏈表題型總結】

點擊上方藍字,關注公眾號f51c1164110821cd94c8caca7f060415.png

鏈表概念的講解

鏈表是什么

鏈表是一種線性數據結構,每個節點都存有數據,通過指針將各個節點鏈接在一起。

鏈表的性質

  • 一致性: 每個節點有相同的數據結構,相同的數據大小,內存中占據相同的大小,存儲相同的數據類型。
  • 有序性: 節點之間的相對順序固定,排在某節點前面的節點就是它的前驅,后面的節點就是它的后繼,所以定義里面有'線性'。

鏈表的分類

鏈接方式分類:單向鏈表,雙向鏈表。

ps: 代碼展示只用單鏈表舉例。

單鏈表結構

c0137b08f78e15e0b8a2550d189184ba.png

單鏈表中的每個結點包含數據+指向后繼節點的指針,通過這種方式,單鏈表將所有結點按順序組織起來。

節點定義

class?Node(object):"""單鏈表結構的Node節點"""
????def?__init__(self,?data,?next_node=None):"""Node節點的初始化方法。
????????data:存儲的數據
????????next:下一個Node節點的引用地址
????????"""
????????self.data?=?data
????????self.next?=?next_node

雙鏈表結構

a617c5eb6b18b3f713757e2948ee1235.png

雙鏈表中的每個節點包含數據+指向前驅和后繼的指針。

鏈表的基本操作

鏈表基本操作: ?插入,搜索,刪除。以下分別講每個操作是如何操作的,時間復雜度多少,為什么是那么多,根據時間復雜度判斷鏈表的適合場景。

查找

按照索引/值查找: 遍歷找到對應的位置/值,然后返回該節點。

#?按照值查找
node?=?head_nodewhile?node.data?!=?value:
????node?=?node.next_node#?按照索引查找
pos?=?0while?pos?!=?index:
????node?=?node.next_node
????pos?+=?1

時間復雜度:是線性遍歷的,所以時間復雜度是O(n)。因為時間復雜度相對較高,所以在大量數據需要經常用檢索的時候就不要用鏈表了。

插入

按照index插入

1.先創建新節點new_node

2.找到要插入的位置的前驅節點pre

3.新節點new_node指向pre的后繼節點

4.pre指向新節點

new_node.next?=?pred.next
pred.next?=?new_node

時間復雜度:由于第2步要線性遍歷去找index位置,所以時間復雜度是O(n)。如果插入在頭部,就不需要找位置,時間復雜度是O(1)。

刪除

如何做刪除的?

1.找到待刪節點的前驅pred

2.把它的前驅節點的后繼指向待刪節點后繼的后繼

pred.next?=?pred.next.next

時間復雜度:因為要去找前驅,所以線性遍歷,時間復雜度是O(n)。如果刪除頭部,就不需要找位置,時間復雜度是O(1)。

鏈表常見的考點: 啞節點(邊界條件)- 用于簡化邊界情況,鏈表為空或鏈表的頭結點和尾節點。解決辦法,自己創建一個啞節點,然后把它的后繼連接原節點。

鏈表的實際應用,通常用于順序記錄的存儲,無需提前分配空間,僅適用小規模數據存儲。

對于適用的操作屬性來說,鏈表適合查找少,無需排序的使用場景,原因:是鏈表的查找效率不高,通過調整指針可以快速調節節點的相對位置。

業界應用: 小規模日志記錄(通話記錄或通訊錄),讀到內存中后可以以鏈表的方式進行存儲;操作系統中內存快的緩存也可以用鏈表來實現,LRU緩存(利用了鏈表快速調整相對位置優勢)。

模式識別

以下這些適用解決鏈表相關問題。

runner and chaser類型題目中有關鍵詞: 要尋找每個特定位置/相對位置。就用后移速度不同的快慢指針來解決使以下文章用到這個方法:
  • 【LeetCode-19-Remove Nth Node From End of List】刪除鏈表的倒數第N個節點

  • 【LeetCode-141-Linked List Cycle】環形鏈表

  • 【LeetCode-876-Middle of the Linked List】鏈表的中間節點

遍歷并處理節點: 處理包括交換,改數值,改指針,刪除等等這類問題的處理方式是每次操作都是當前節點或某類節點,每次處理單個或一對節點;處理的時候,先改變前驅指針,再改變當前節點指針,否則當前節點的next信息改變完之后就不對了,通過先改變前驅的指針到達一個保存狀態的目的。要動一個元素的后繼之前,先保存它的后繼。
  • 【LeetCode24. Swap Nodes in Pairs】兩兩交換鏈表中的元素

  • 【LeetCode-25-Reverse Nodes in k-Group】K 個一組翻轉鏈表

  • 【LeetCode-143-Reorder List】重排鏈表,次頭條。

處理兩個或多個鏈表處理方式是用while循環進行常規處理,循環條件是list1非空并且list2非空,當循環跳出后處理剩下的非空列表。循環至空,再處理剩余。
  • 【LeetCode-21. Merge Two Sorted Lists】合并兩個有序鏈表?

應用遞歸處理(涉及鏈表倒序處理問題)解決當前問題依賴于存在的相似結構的子問題;利用調用函數本身,先解決子問題,再利用子問題的結果解決當前的問題,遞歸的出口通常是問題的初始條件n=1的情況。鏈表問題一旦需要倒序處理或與樹之間的數據結構進行相互轉換往往會用到遞歸,或者用棧來解決。LeetCode369,426,因為這兩道題要會員才能做,我不能做,所以沒有寫題解。

自己實現一個單鏈表類

實現插入查找刪除的功能。

class?ListNode(object):
????def?__init__(self,?value):"""
????????value:?節點的數據值
????????next:?節點的后繼
????????"""
????????self.value?=?value
????????self.next?=?None
class?MyLinkedList(object):
????def?__init__(self):"""
????????Initialize?your?data?structure?here.
????????"""
????????self.head?=?ListNode(0)?#?用啞結點來當頭節點,方便處理插入和刪除的邊界情況。
????????self.size?=?0
????def?get(self,?index):"""按照索引查找
????????Get?the?value?of?the?index-th?node?in?the?linked?list.?If?the?index?is?invalid,?return?-1.
????????:type?index:?int
????????:rtype:?int
????????"""#?異常情況:?如果索引無效?|?索引超出范圍if?index?=?self.size:return?-1
????????node?=?self.headfor?_?in?range(index?+?1):?#?記得鏈表的頭結點是啞結點,所以range后界要+1
????????????node?=?node.nextreturn?node.value?#?是返回節點值
????def?addAtHead(self,?val):"""添加到頭節點
????????Add?a?node?of?value?val?before?the?first?element?of?the?linked?list.?After?the?insertion,?the?new?node?will?be?the?first?node?of?the?linked?list.
????????:type?val:?int
????????:rtype:?None
????????"""
????????self.addAtIndex(0,?val)
????def?addAtTail(self,?val):"""添加到尾節點
????????Append?a?node?of?value?val?to?the?last?element?of?the?linked?list.
????????:type?val:?int
????????:rtype:?None
????????"""
????????self.addAtIndex(self.size,?val)
????def?addAtIndex(self,?index,?val):"""按照索引添加node
????????:type?index:?int
????????:type?val:?int
????????:rtype:?None
????????"""#?異常情況:?如果索引無效?|?索引超出范圍if?index?=?self.size?+?1:return?#?什么都不做#?找到要加入節點的前驅節點
????????node?=?self.headfor?_?in?range(index):?
????????????node?=?node.next#?加入新節點
????????new_node?=?ListNode(val)?#?創建新節點
????????new_node.next?=?node.next
????????node.next?=?new_node#?鏈表的總數加1
????????self.size?+=?1
????def?deleteAtIndex(self,?index):"""刪除節點
????????因為刪除操作的流程是,待刪節點node的前驅pre,改變pre后繼節點到node的后繼節點,所以找的節點應該是pre
????????:type?index:?int
????????:rtype:?None
????????"""#?異常情況:?如果索引無效?|?索引超出范圍if?index?=?self.size:return?#?什么都不做#?找到要刪除的節點
????????node?=?self.headfor?_?in?range(index):?#?找到待刪節點的前驅節點,因為我們已經在頭部加了啞結點,所以真正的頭部節點是不用單獨處理的,按照常規刪節點的方式處理
????????????node?=?node.next#?刪除待刪節點
????????node.next?=node.next.next#?鏈表的總數減1
????????self.size?-=?1

參考資料:

- 力扣

原創文章,歡迎轉載,轉載請在公眾號菜單欄查看【聯系我】。

6b084b543d17487936c6128c55c39819.png

? ? ? ? ? ? ? 喜歡本文的小伙伴點【在看】分享給你的朋友?↓↓↓

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/538506.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/538506.shtml
英文地址,請注明出處:http://en.pswp.cn/news/538506.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

win10 C盤超過50G?教你如何對C盤瘦身!

原文鏈接:http://blog.csdn.net/u012762305/article/details/53469446 點擊閱讀原文 ------------------------------------------- 本人C盤是128G SSD硬盤,Win10系統盤和一些常用的程序都裝在這個盤(特大程序除外),…

python的kite下載安裝及使用_Kite下載|Kite Python編程工具 V1.2020.1203.0 最新版下載 - 下載銀行...

Kite是一款專為Python打造的一款代碼補全軟件,如果你正在學習Python或是從事與Python相關的編程工作,那么這款軟件絕對是你的好幫手!其會智能判斷用戶想要輸入的每個代碼字段,并在所有庫中進行匹配相應的內容,如果看到…

layui前端時間戳轉化

https://blog.csdn.net/rightbeforethesix/article/details/80358890轉載于:https://www.cnblogs.com/newlangwen/p/9144204.html

單頁web應用是什么?它又會給傳統網站帶來哪些好處?

原文鏈接:http://blog.csdn.net/zuoninger/article/details/38842823 點擊閱讀原文 ---------------------------------------------------- 什么是單頁應用? 單頁應用是指在瀏覽器中運行的應用,它們在使用期間不會重新加載頁面。像所有的…

python圖像等比例壓縮_python使用pil進行圖像處理(等比例壓縮、裁剪)實例代碼

PIL中設計的幾個基本概念1.通道(bands):即使圖像的波段數,RGB圖像,灰度圖像以RGB圖像為例:>>>from PIL import Image>>>im Image.open(*.jpg) # 打開一張RGB圖像>>>im_bands im.getbands() # 獲取RG…

python的urllib四大模塊_Python常用的內建模塊4:urllib

urllib提供了一系列用于操作URL的功能Geturllib的request模塊可以非常方便的抓取URL的內容, 也就是發送一個GET請求到制定的頁面, 然后返回HTTP的響應:例如, 對豆瓣的一個URLhttps://api.douban.com/v2/book/2129650進行抓取, 并返回響應:from urllib import requestwith reque…

Linux 升級 Python 至 3.x

原文鏈接:http://blog.csdn.net/liang19890820/article/details/51079633 -------------------------------------------- 簡述 CentOS 7 中默認安裝了 Python,版本比較低(2.7.5),為了使用新版 3.x,需要對…

Sublime Text 3 配置python交互運行環境的快捷鍵

2019獨角獸企業重金招聘Python工程師標準>>> 使用Sublime Text 3能以輕量級的環境寫python腳本,運行python代碼。為了更加方便地調用python腳本,通過在Sublime Text 3中綁定快捷鍵的方式,實現一鍵調用python交互運行環境&#xff…

xftp如何搜索文件_頭條搜索站長平臺如何添加網站和sitemap文件?附圖文教程

頭條搜索站長平臺已經上線了,目前我們廣大站長都可以登錄該平臺后添加新網站和提交 sitemap 地圖文件,建議大家可以前往嘗試一下,多一個搜索平臺就多一條路,認為倒是挺好的。下面就跟大家簡單介紹頭條搜索站長平臺如何添加網站和提…

Angular4中常用管道

原文鏈接:http://blog.csdn.net/haijing1995/article/details/71404350 ----------------------------------------------------- Angular4中常用管道 通常我們需要使用管道實現對數據的格式化,Angular4中的管道和之前有了一些變化,下面說一…

mysql死鎖無法查詢_MySQL死鎖導致無法查詢

客服反饋后臺無法查詢,原因大概知道,是因為MySQL的事務產生了死鎖,以往都不知道是哪個事務鎖住了,只能很粗暴地重啟MySQL最近查找到一個方法,不用重啟MySQL,記錄如下登錄到MySQL,來看下有哪些My…

彩鉛練習,花船

圖片發自簡書App圖片發自簡書App

python 百度ocr識別_Python使用百度Ocr識別文字保存CSV

1.準備:1)Python開發環境, 筆者用的是3.7; 工具用的是Pycharm2)百度云后臺創建文字識別的應用, 獲取AppID, API key, Secret Key百度云后臺創建文字識別的應用3) 百度模塊pip install baidu-aip安裝百度模塊4) 要保存成csv需要用到pandas模塊pip Install pandas安裝…

chrome解決跨域(CORS)問題---chrome插件

1、chrome瀏覽器 chrome中跨域問題,可以安裝插件解決, 插件地址 https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi 地址需要翻墻 翻墻hosts:https://laod.cn/hosts/2017-google-host…

我的女朋友漏電了–論C++中的失敗(failure),缺陷(bug)和異常(exception)

先做個廣告置入,如果喜歡這篇文章,你可以到 zhaoyan.website/blog 去查看于此類似的C/C文章。 我承認有點標題黨了,不過這真的是一篇寫軟件的文章,所以如果你已經抽出了一張面巾紙,那么趁早再把它完美的放回去。這篇軟…

SQLplus 和mysql區別_mysql和oracle的區別有哪些

MySQL和Oracle都是流行的關系數據庫管理系統(RDBMS),在世界各地廣泛使用;大多數數據庫以類似的方式工作,但MySQL和Oracle的這里和那里總是存在一些差異的。本篇文章就給大家比較Oracle和MySQL,介紹Oracle和MySQL之間的區別&#x…

127.0.0.1與localhost的區別

2019獨角獸企業重金招聘Python工程師標準>>> 區別1: localhost也叫local ,正確的解釋是:本地服務器 127.0.0.1在windows等系統的正確解釋是:本機地址(本機服務器) 他們的解析通過本機的host文件,windows自動將localhost解析為127.…

一個項目經理的貪嗔癡

我有時候在想,自己到底是一個什么角色?產品經理?還是一個項目經理?或者只是一個技術經理。 身邊一些朋友說,自己想轉行做一個產品經理,做一個偉大的產品。我奉勸他們說還是省省吧,在這樣一個二三…

mysql 索引_MySQL之索引

索引查找算法BTREEBTREE查找算法演變B-TREE :普通 BTREE,平衡多路查找樹(B-Tree)BTREE :葉子節點雙向指針BTREE(B*TREE):枝節點的雙向指針普通B-TREE增強版BTREE(B*TREE)總結:從上圖看出,在BTree上有兩個頭…

2010年寒假學習心得

本人的博客園博客:http://www.cnblogs.com/zengmiaogen 博客園是我早期發表的博文。 ------------------------------------------ 1、心態要好,要相信自己能完成,不要擔心自己完成不了,萬事開頭難,有挫折是正常的。…