成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

鏈表基礎之LeetCode題解

開發 前端
鏈表是一種物理存儲單元上非連續、非順序的存儲結構。由于不必須按順序存儲,鏈表的插入和刪除操作可以達到O(1)的復雜

[[377395]]

前言

今天繼續算法題:從尾到頭打印鏈表

鏈表

在看今天題目之前,我們先了解下鏈表。

鏈表是一種物理存儲單元上非連續、非順序的存儲結構。由于不必須按順序存儲,鏈表的插入和刪除操作可以達到O(1)的復雜度

熟悉數組的都知道,數組是需要一塊連續的內存空間來存儲。而鏈表就不需要,它是通過指針來將內存塊串聯起來。

常見的鏈表結構有:單鏈表、雙向鏈表和循環鏈表。(圖片來自參考鏈接)

單鏈表

 

第一個接點為頭結點,最后一個結點是尾結點。

從圖中可以看出來:當某個結點不是指向下一個結點,而是指向了null,空地址,那么這個結點就是這個鏈表最后一個結點,也就是尾結點。

當我們插入或者刪除結點只需要修改next結點就行,也就是修改next指針指向地址,比如這樣一個鏈表:

  1. a->next=b, b->next=c, c->next=d 

a下一個結點是b,b下一個結點是c...

如果我們要在ab直接插入一個結點p,得益于鏈表的不連續性,我們只需要修改a的next為p,p的next為b就行了。

  1. a->next=p, p->next=b, b->next=c, c->next=d 

通俗點說,插入的時候,就修改兩個結點的跟屁蟲就行啦。所以不同于數組插入和刪除操作,鏈表的插入和刪除效率很高,不需要考慮空間連續問題,所以對應的時間復雜度是O(1)。

但是反過來,如果要查詢第n個數據為誰,這個就比較麻煩了。不像數組由于內存連續,所以很輕易就知道n對應的數據。而鏈表需要一個個next查找,所以鏈表隨機訪問的效率就不如數組了,時間復雜度為O(n)。

循環鏈表

 

循環鏈表和單鏈表的區別就是,尾結點指針會指向頭結點,形成一個環形,這就是循環鏈表。

雙向鏈表

 

如圖所示,雙向鏈表和單鏈表的區別就是,每個結點不僅有下個結點的地址,還有上一個結點的地址。

這樣有什么好處呢?在特定的情境中能提高效率。比如我要在某個結點B的前面插入數據,那么我需要從頭開始便利,找到某個結點的next指向這個B的地址,然后進行數據的插入。

但是雙向鏈表則可以直接獲知結點B的前驅結點地址,大大提高了插入效率。

鏈表的基礎知識就介紹到這里了,下面看一個鏈表相關的算法題。

題目:從尾到頭打印鏈表

輸入一個鏈表的頭節點,從尾到頭反過來返回每個節點的值(用數組返回)。

示例 1:

輸入:head = [1,3,2] 輸出:[2,3,1]

限制:

0 <= 鏈表長度 <= 10000

解法一

題目意思很簡單,就是一個鏈表,現在要先從尾巴倒著打印鏈表的數字。

那我們就可以想到可以用到遞歸算法,遞歸算法其實就是兩步,先遞后歸,我們可以先傳遞到鏈表的最后一位,也就是next->null為空的時候,然后開始歸檔把數據依次輸出,即完成了從結尾開始輸出數字的需求了。

  • 遞推階段:走到鏈表結尾為結束的標志。
  • 歸檔階段:從結尾處一層層輸出數字,先輸出到ArrayList,在轉為數組。

不明白的可以看看代碼:

  1. class Solution { 
  2.     ArrayList<Integer> tmp = new ArrayList<Integer>(); 
  3.     public int[] reversePrint(ListNode head) { 
  4.         recur(head); 
  5.         int[] res = new int[tmp.size()]; 
  6.         for(int i = 0; i < res.length; i++) 
  7.             res[i] = tmp.get(i); 
  8.         return res; 
  9.     } 
  10.  
  11.     //遞歸方法 
  12.     void recur(ListNode head) { 
  13.      //到鏈表結尾處,遞推結束,開始歸檔,依次輸出 
  14.         if(head == nullreturn
  15.         recur(head.next); 
  16.         tmp.add(head.val); 
  17.     } 

方法消耗情況

  1. 執行用時:1 ms 
  2. 內存消耗:40.5 MB 

時間復雜度

該算法相當于遍歷了兩遍鏈表,遞推一遍,歸檔一遍,所以一共為2n。

去除常量,時間復雜度就是O(n)

空間復雜度

由于用到ArrayList和數組,所以空間復雜度也是O(n)。

解法二

第二種解法就是利用棧的特點:先入后出。(棧的知識點后面再細說)

先入后出不就是題目的需求么,從尾部倒著輸出數字。

所以我們把鏈表依次入棧,然后在依次出棧就可以完成需求了。

  1. class Solution { 
  2.     public int[] reversePrint(ListNode head) { 
  3.         LinkedList<Integer> stack = new LinkedList<Integer>(); 
  4.         while(head != null) { 
  5.             stack.addLast(head.val); 
  6.             head = head.next
  7.         } 
  8.         int[] res = new int[stack.size()]; 
  9.         for(int i = 0; i < res.length; i++) 
  10.             res[i] = stack.removeLast(); 
  11.     return res; 
  12.     } 

方法消耗情況

  1. 執行用時:1 ms 
  2. 內存消耗:39.2 MB 

時間復雜度

同上一個算法一樣,時間復雜度就是入棧和出棧的時間,也就是O(n)。

空間復雜度

由于用到了stack和數組res,所以空間復雜度也是O(n)。

參考

https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/

https://time.geekbang.org/column/article/41013

本文轉載自微信公眾號「碼上積木」,可以通過以下二維碼關注。轉載本文請聯系碼上積木公眾號。

 

責任編輯:武曉燕 來源: 碼上積木
相關推薦

2021-02-04 08:18:53

LeetCode鏈表

2021-01-28 08:20:41

鏈表空間復雜度

2021-02-03 13:23:42

鏈表倒數結點

2021-03-12 08:19:20

數組跳躍游戲

2021-01-22 08:30:50

LeetCode數字數組

2022-02-16 09:12:22

LeetCode升序鏈表鏈表數組

2021-03-22 08:23:29

LeetCode二叉樹節點

2022-01-17 09:23:02

LeetCode刪除鏈表算法

2021-01-15 08:19:26

二維數組LeetCode

2021-03-02 08:21:58

LeetCode括號

2021-03-17 08:19:22

二叉樹LeetCode

2021-12-31 09:01:44

LeetCode 羅馬數字四數之和

2021-10-29 11:27:52

鏈表數據結構算法

2021-04-12 15:47:00

數據結構算法鏈表

2021-07-13 07:52:03

Python數據結構

2021-07-15 06:43:12

Python數據結構

2017-03-01 13:58:46

Python數據結構鏈表

2021-12-01 09:00:57

LeetCode回文數字算法

2022-10-12 09:01:11

動態規劃算法題

2022-02-11 09:42:21

Swift開發語言LeetCode
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91欧美 | 欧美日韩精品在线免费观看 | 亚洲欧美国产毛片在线 | 色精品视频 | 成年人网站免费视频 | 亚洲视频在线免费观看 | 风间由美一区二区三区在线观看 | 欧美性网站| 国产成人免费视频网站视频社区 | 欧美成人aaa级毛片在线视频 | 国产91久久精品一区二区 | 国产福利91精品一区二区三区 | 国产精品一区二区三区99 | 99tv| 久久99精品久久久 | 国产精品一区二区三区在线 | 男人天堂国产 | 久久免费大片 | 久草网址| 亚洲精品麻豆 | 尤物在线精品视频 | 天堂在线中文字幕 | 免费在线观看一区二区 | 丁香综合| 亚洲欧洲综合av | 亚洲精品日韩综合观看成人91 | 免费视频二区 | 日韩在线三级 | 欧美二区三区 | 成人激情视频 | 天堂网色 | 在线一区二区三区 | 日韩精彩视频 | 久久久婷婷 | 久久久精品久 | 亚洲精品一区av在线播放 | 中文字幕一区二区三区四区五区 | 欧美日韩国产传媒 | 丁香婷婷成人 | 在线观看精品 | 久久精品中文字幕 |