三步捋清鍊表相關題型!

2020-12-21 CSDN

作者 | 思秀 責編 | 張文

頭圖 | CSDN 下載自視覺中國

來源 | sigua心底的小聲音(ID:SiguaMatrix108)

鍊表概念的講解

鍊表是什麼:

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

鍊表的性質:

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

連結方式分類:單向鍊表,雙向鍊表。

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

單鍊表結構

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

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

雙鍊表結構

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

鍊表的基本操作:

鍊表基本操作: 插入、搜索、刪除。

以下分別講每個操作是如何進行的,時間複雜度多少,為什麼是那麼多,根據時間複雜度判斷鍊表的適合場景。

查找

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

# 按照值查找node = head_nodewhilenode.data != value:node = node.next_node

# 按照索引查找pos = 0whilepos != index: node = node.next_nodepos += 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 的情況。鍊表問題一旦需要倒序處理或與樹之間的數據結構進行相互轉換往往會用到遞歸,或者用棧來解決。

自己實現一個單鍊表類

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

classListNode(object):def__init__(self, value):""" value: 節點的數據值 next: 節點的後繼 """ self.value = value self.next = NoneclassMyLinkedList(object):def__init__(self):""" Initialize your data structure here. """ self.head = ListNode(0) # 用啞結點來當頭節點,方便處理插入和刪除的邊界情況。 self.size = 0defget(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 < 0or index >= self.size:return-1 node = self.headfor _ in range(index + 1): # 記得鍊表的頭結點是啞結點,所以range後界要+1 node = node.nextreturn node.value # 是返回節點值defaddAtHead(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)defaddAtTail(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)defaddAtIndex(self, index, val):"""按照索引添加node :type index: int :type val: int :rtype: None """# 異常情況: 如果索引無效 | 索引超出範圍if index < 0or 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 += 1defdeleteAtIndex(self, index):"""刪除節點 因為刪除操作的流程是,待刪節點node的前驅pre,改變pre後繼節點到node的後繼節點,所以找的節點應該是pre :type index: int :rtype: None """# 異常情況: 如果索引無效 | 索引超出範圍if index < 0or index >= self.size:return# 什麼都不做# 找到要刪除的節點 node = self.headfor _ in range(index): # 找到待刪節點的前驅節點,因為我們已經在頭部加了啞結點,所以真正的頭部節點是不用單獨處理的,按照常規刪節點的方式處理 node = node.next# 刪除待刪節點 node.next =node.next.next# 鍊表的總數減1 self.size -= 1

相關焦點

  • 數據結構之鍊表
    ,通過指針將一個個零散的內存塊連接起來,鍊表的每個內存塊稱為結點。鍊表的種類主要有三種,單鍊表,雙鍊表,雙向循環鍊表。鍊表的優缺點鍊表是一種鏈式結構,使得它對內存沒有太大的要求。可以充分使用散亂的內存空間,插入和刪除的時間複雜度比數組好。但是結構實現起來比較複雜,容易出錯。而且不具備隨機訪問的特性,每次查詢都要從頭節點出發。
  • 《崩壞3》藍寶石鍊表怎麼獲得 藍寶石鍊表獲取攻略大放送
    《崩壞3》藍寶石鍊表怎麼獲得 藍寶石鍊表獲取攻略大放送時間:2020-03-03 17:29   來源:小皮手遊網   責任編輯:沫朵 川北在線核心提示:原標題:《崩壞3》藍寶石鍊表怎麼獲得 藍寶石鍊表獲取攻略大放送 崩壞3藍寶石鍊表有什麼用?如何獲取?
  • 雅思口語滿分老師,雅思口語點評+捋清思路+完善英語表達!
    雅思口語滿分老師,雅思口語點評+捋清思路+完善英語表達!> 來源:塔基國際教育 原標題:雅思口語滿分老師,雅思口語點評+捋清思路
  • 影視劇中一語雙關的名字,又是捋不清又是寫不動的,著實心疼編劇
    1、電視劇局中人裡面,懟天懟地懟沈林的呂步青,他的名字就像是他的腦子一樣,捋不清,所有的事情得失他都捋不清緣由,陳偉奎的案子是這樣,汪洪濤的案子也是這樣,似乎他根本就不是為了辦案,而是為了和沈林較勁一樣,兩人之間就差大打出手了,根本就不能和平的在一間屋子裡開完會,他們的局長也是十分頭疼。
  • 從尾到頭列印鍊表(劍指 Offer 題解Java版)
    從尾到頭列印鍊表題目連結牛客網https://www.nowcoder.com/practice/d0267f7f55b3412ba93bd35cfa8e8035?使用遞歸要逆序列印鍊表 1->2->3(3,2,1),可以先逆序列印鍊表 2->3(3,2),最後再列印第一個節點 1。而鍊表 2->3 可以看成一個新的鍊表,要逆序列印該鍊表可以繼續使用求解函數,也就是在求解函數中調用自己,這就是遞歸函數。
  • 氧化還原反應相關題型分析
    在教師招聘考試中,氧化還原反應相關知識是考試重點也是難點,而其中氧化還原反應基本原理的考察屬於常考題型,考試過程中主要存在的問題包括:(1)不理解氧化還原反應的概念;(2)為不理解元素化合價發生變化的本質;(3)對氧化性、還原性強弱的理解有誤區等。這類題目主要以選擇題的形式考察,下面就針對例題談一下這類題目的解題思路。
  • 寫給零基礎的前端算法入門指南,acmer帶女友刷80+【棧與隊列與鍊表篇】
    ,都是以 leetcode一些簡單以及中等難度的居多,而這些算法對於科班來說的話,應該在學校都學習過,比如算法分析與設計,數據結構與算法這一類課程,那麼有這個基礎,你的刷題時間又可以進行縮短了第三點,既然說到要刷題,該如何刷,我在掘金參考了幾個大佬(文末有參考處),大家都會推薦分專題來刷,在這裡,我也是非常推薦的,在這裡,我希望的是將刷算法題的數量再減少一點,帶你入門,當你刷完這些專題之後,你就有相關思維能力主動去刷題了
  • 太清六合八法樁功四式
    度成右弓步摟膝左按掌——纏手四六步推拉掌——右臂外旋弓步側推掌(左右重複兩次)。 三、凌燕雙飛勢(口訣):雙手上託至眉梢,內旋下按半山腰,平推平抹雙捋式,凌燕雙飛肘勿翹。(動作提示):雙手外旋掌心向上託至眉梢處——雙手內旋曲膝下落至腹前——雙手向左、向前、向右旋轉成左捋式——雙臂「抱式」緩緩向右旋轉——再成左捋式——左弓步探掌、抹掌揉腹成四六步雙臂上舉。
  • DKNY 陶瓷鍊表 異材質結合的完美「表」現
    DKNY 本季以紐約市的現代主義為靈感,以 New Yorker 們最常穿的黑、灰、海軍藍與裸色為基底來做本季發想,而在配件上也配合此主題,推出女性冬季陶瓷鍊表與飾品。女陶瓷鍊表NY8390與NY8391運用了陶瓷與不鏽鋼的相扣纏繞創造零衝突的完美結合。
  • 原型鏈就是個鍊表,有啥好研究的,隔三差五來一下,走馬燈麼?
    如果你想理解原型系統是個啥, 那就去看看數據結構中的鍊表, 回顧下大學課程, 對於那些不是科班出身的同學, 我想說的是網易雲課堂有免費的, 可以白嫖, 搜文章看對你沒有多大幫助, 缺少這些計算機基本的知識, 你的職業生涯不僅沒有上限而且短命.
  • 八門勁法之捋法在太極拳中妙處,「捋在尺中」
    從防守角度看,用捋很重要的一點足,近身一手「肘不貼脅」「腕不貼胸」「掤勁不丟」。「捋在尺中」拳訣有「捋在掌中」與「捋在尺中」兩種說法,前者泛指手掌中的觸覺要靈敏,始能隨捋進著;後者是指傳統太極拳的以尺骨捋人。用尺骨捋人有什麼好處呢?
  • 直線與圓錐曲線位置關係有關技能,助你有效攻克相關高考高頻題型
    近五年高考所有相關題目列舉如下:① 2016年高考1卷理數的圓錐曲線有關題目② 2017年高考1卷理數的圓錐曲線有關題目③ 2018年高考1卷理數的圓錐曲線有關題目而且,題型多為直線與圓錐曲線的綜合應用,偶爾為圓錐曲線基本題型或圓與圓錐曲線的綜合應用。② 有一道壓軸大題題型一般為直線與圓錐曲線的綜合應用。
  • 香奈兒Code Coco山茶花鍊表,源自經典的風格時計
    取材於香奈兒女士所鍾愛的山茶花,結合山茶花雕刻、珍珠和鑽石,打造出唯美的Premiere山茶花鍊表。Première山茶花鍊表:直徑19.7 x 15.2 x 7.8mm 18K黃金表殼,表款鑲鑽/時分顯示/石英機芯/藍寶石水晶鏡面/限量1隻另一方面,新作Première山茶花鍊表也同樣取材品牌經典元素,以山茶花圖騰入表。在香奈兒女士的人生中,「山茶花」有著非常特殊的意義。
  • 關於函數中的題型,歷年高考數學必考十七大題型和答題技巧匯總
    高考數學是題型固定的科目之一,而考點也是十分固定的。本次課程我們總結了歷年的高考真題,其中有十七大是必考的考點,本次課程我們給大家著重總結一下,以及相關的答題技巧,下次課程會給出詳細的真題展示,歡迎大家跟我們一起學習哦。
  • 做高中橢圓基礎題型的一般過程
    分析歷年各省份的高考理科數學卷可以發現,高考中,橢圓題型,一般思路並不難,而且有時候很直接,但很多人卻拿不下滿分,甚至有直接放棄的,一般是運算缺乏訓練,沒有足夠的計算自信心,其實這也是大多數學生的問題,就是不會處理大數據,不敢嘗試設未知數,怕解不出來。
  • 女神捋了一下頭髮,那「捋頭髮」用英語怎麼說?用run就能搞定!
    咔咔覺得一個美女或者一個帥哥在我面前捋頭髮是非常有魅力的一個事情。那女神在我面前捋了一下頭髮,這個「捋了一下頭髮」英語怎麼說呢?別看這句話貌似很複雜,但是在英語中,用一個非常簡單的單詞就能搞定——就是run。具體怎麼表達呢?
  • 考研英語新題型衝刺備考-如何巧做該題型
    相信很大一部分同學對於大分值題型,比如說傳統閱讀、翻譯和寫作這幾個板塊已經掌握的差不多了,但是可能對於新題型,也就是閱讀理解的part B,有的同學感覺做起來比較順手,而還有一部分同學感覺百思不得其解。這是為什麼呢?對比傳統閱讀,我們會發現,新題型的篇幅和單詞數量甚至難度都要大很多,而且和傳統閱讀的考試題型也完全不同,因此我們還能用傳統閱讀的解題技巧去應對新題型嗎?答案是否定的。
  • 只要四步就可以讓你的孩子數學越來越優秀
    今天老師就來教會家長和孩子,只要四步,就可以讓你的孩子輕鬆學好小學數學!把整個小學階段的數學運用題分類整理(由於篇幅有限我這裡只整理了部分,要全面的家長可以購買這套《給孩子們的數學三書》裡面有最全面的32種題型),以後遇到同樣的題型孩子就會做了, 實際上整個小學數學的應用題,奧數題只有32種, 只要把這32種應用題奧數題全部弄懂吃透,孩子的數學肯定優秀。
  • 國考數量關係,9大題型和考點匯總在這!
    最後的衝刺備考階段,對於大部分考生而言,基本上就是不停刷題,但是刷題的同時,需要注意的是,對於一些題型的技巧積累。今天陝西中公教育小編整理匯總了國考數量關係9大題型和考點,趕快來學習吧!題型介紹數量關係主要報考者理解、把握事物間量化關係和解決數量關係問題的能力,主要涉及數據關係的分析、推理、判斷、運算等。
  • 不懂算我的:三分鐘搞定單鍊表
    鍊表詳解首先,為什麼第一個數據結構要看鍊表呢?因為鍊表是實際開發工作中使用最頻繁的數據結構,並且也是面試中面試官最愛問的數據結構之一,我現在任職的這家公司當時面試我的時候就是手寫鍊表與隊列的相互轉換。所以掌握並熟練的手寫鍊表是很有必要的。下面我們就進入正題。