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

揭開鏈表的真面目

開發(fā) 前端
鏈表是一種常見的數(shù)據(jù)結(jié)構(gòu),鏈表是由一連串的結(jié)點組成,這個節(jié)點就是鏈結(jié)點,每個鏈結(jié)點都由數(shù)據(jù)域和指針域兩部分組成。

 鏈表是一種常見的數(shù)據(jù)結(jié)構(gòu),鏈表是由一連串的結(jié)點組成,這個節(jié)點就是鏈結(jié)點,每個鏈結(jié)點都由數(shù)據(jù)域和指針域兩部分組成。

[[337325]]

使用鏈表結(jié)構(gòu)可以克服數(shù)組結(jié)構(gòu)需要預(yù)先知道數(shù)據(jù)大小的缺點,鏈表結(jié)構(gòu)可以充分利用計算機內(nèi)存空間,實現(xiàn)靈活的內(nèi)存動態(tài)管理。但是鏈表失去了數(shù)組隨機讀取的優(yōu)點,同時鏈表由于增加了結(jié)點的指針域,空間開銷比較大。

鏈表比較好的一種理解是:將鏈表看成一個火車,每個車廂之間都是相互連接的,只要找到火車頭,就可以找到具體的車身。鏈表也是,我們只關(guān)心它的頭。

一 單向鏈表

1.1 單向鏈表原理圖

單向鏈表的一個鏈結(jié)點包含數(shù)據(jù)域和下一個鏈結(jié)點的指針。頭結(jié)點也包含數(shù)據(jù)域和指針域,但是一般為了方便查找,頭節(jié)點不寫數(shù)據(jù),最后一個結(jié)點的指針指向空。

 

1.2 實現(xiàn)單向鏈表的存儲等操作

創(chuàng)建一個鏈結(jié)點的實體類

  1. public class Node { 
  2.  
  3.     // 數(shù)據(jù)域 
  4.     public long data; 
  5.     // 指針域 
  6.     public Node next
  7.  
  8.     public Node(long value){ 
  9.         this.data = value; 
  10.     } 

1.2.1 插入一個節(jié)點

在頭節(jié)點后插入一個結(jié)點,第一步需要將新插入的結(jié)點指向頭結(jié)點指向的結(jié)點,第二步將頭結(jié)點指向新插入的結(jié)點。插入結(jié)點只需要改變一個引用,所以復(fù)雜度為O(1)。

  1. public class LinkList { 
  2.  
  3.     private Node head; 
  4.     /** 
  5.      * 在頭節(jié)點之后插入一個節(jié)點 
  6.      */ 
  7.     public void insertFirst(long value){ 
  8.         Node node = new Node(value); 
  9.         node.next = head; 
  10.         head = node; 
  11.     } 

1.2.2 頭結(jié)點后刪除一個結(jié)點

在頭結(jié)點后刪除一個結(jié)點,就是讓頭結(jié)點指向這個結(jié)點的下一個結(jié)點。復(fù)雜度也是O(1)。

  1. public Node deleteFirst(){ 
  2.     Node tmp = head; 
  3.     head = tmp.next
  4.     return tmp; 

1.2.3 根據(jù)數(shù)據(jù)域查找結(jié)點

查找需要比對每個結(jié)點的數(shù)據(jù),理論上查找一個結(jié)點平均需要N/2次,所以復(fù)雜度為O(N)。

  1. public Node find(long value){ 
  2.  
  3.     Node current = head; 
  4.     while (current.data != value){ 
  5.         if(current.next == null){ 
  6.             return null
  7.         } 
  8.         current = current.next
  9.     } 
  10.     return current

1.2.4 根據(jù)數(shù)據(jù)與刪除結(jié)點

查找需要比對每個結(jié)點的數(shù)據(jù),理論上刪除一個結(jié)點平均需要N/2次,所以復(fù)雜度為O(N)。

  1. public Node delete(int value){ 
  2.     Node current = head; 
  3.     // 當前結(jié)點的前一個結(jié)點 
  4.     Node pre = head; 
  5.     while (current.data != value){ 
  6.         if(current.next == null){ 
  7.             return null
  8.         } 
  9.         pre = current
  10.         current = current.next
  11.     } 
  12.     if(current == head){ 
  13.         head = head.next
  14.     }else
  15.         pre.next = current.next
  16.     } 
  17.     return current

二 雙端鏈表

2.1 雙端鏈表原理圖

雙端鏈表是在單向鏈表的基礎(chǔ)上,頭結(jié)點增加了一個尾結(jié)點的引用。

 

2.2 實現(xiàn)雙端鏈表的存儲等操作

2.2.1 從頭部插入結(jié)點

如果鏈表為空,則設(shè)置尾結(jié)點就是新添加的結(jié)點。復(fù)雜度為O(1)。

  1. public class FirstLastLinkList { 
  2.  
  3.     private Node first
  4.     private Node last
  5.     /** 
  6.      * 在頭結(jié)點之后插入一個節(jié)點 
  7.      */ 
  8.     public void insertFirst(long value){ 
  9.         Node node = new Node(value); 
  10.         if(first == null){ 
  11.             last = node; 
  12.         } 
  13.         node.next = first
  14.         first = node; 
  15.     } 

2.2.2 從尾部插入結(jié)點

如果鏈表為空,則設(shè)置頭結(jié)點為新添加的結(jié)點,否則設(shè)置尾結(jié)點的后一個結(jié)點為新添加的結(jié)點。復(fù)雜度為O(1)。

  1. public void insertLast(long value){ 
  2.     Node node = new Node(value); 
  3.     if(first == null){ 
  4.         first = node; 
  5.     }else
  6.         last.next = node; 
  7.     } 
  8.     last = node; 

2.2.3 從頭部進行刪除

判斷頭結(jié)點是否有下一個結(jié)點,如果沒有則設(shè)置尾結(jié)點為null,復(fù)雜度為O(1)。

  1. public Node deleteFirst(){ 
  2.  
  3.     Node tmp = first
  4.     if(first.next == null){ 
  5.         last = null
  6.     } 
  7.     first = tmp.next
  8.     return tmp; 

三 雙向鏈表

3.1 雙向鏈表原理圖

每個結(jié)點除了保存對后一個結(jié)點的引用外,還保存著對前一個結(jié)點的引用。

 

3.2 實現(xiàn)雙向鏈表的存儲等操作鏈結(jié)點實體類

  1. public class Node { 
  2.  
  3.     // 數(shù)據(jù)域 
  4.     public long data; 
  5.     // 后一個結(jié)點指針域 
  6.     public Node next
  7.     // 前一個結(jié)點指針域 
  8.     public Node prev; 
  9.  
  10.     public Node(long value){ 
  11.         this.data = value; 
  12.     } 

3.2.1 從頭部插入結(jié)點

如果鏈表為空,則設(shè)置尾結(jié)點為新添加的結(jié)點,如果不為空,還需要設(shè)置頭結(jié)點的前一個結(jié)點為新添加的結(jié)點。插入結(jié)點只需要改變兩個結(jié)點的引用,所以復(fù)雜度為O(1)。

  1. public class DoubleLinkList { 
  2.  
  3.     private Node first
  4.     private Node last
  5.  
  6.     /** 
  7.      * 在頭結(jié)點之后插入一個節(jié)點 
  8.      */ 
  9.     public void insertFirst(long value){ 
  10.         Node node = new Node(value); 
  11.         if(first == null){ 
  12.             last = node; 
  13.         } else
  14.             first.prev = node; 
  15.         } 
  16.         node.next = first
  17.         first = node; 
  18.     } 

3.2.2 從尾部插入結(jié)點

如果鏈表為空,則設(shè)置頭結(jié)點為新添加的結(jié)點,否則設(shè)置尾結(jié)點的后一個結(jié)點為新添加的結(jié)點。同時設(shè)置新添加的結(jié)點的前一個結(jié)點為尾結(jié)點。插入結(jié)點只需要改變1個結(jié)點的引用,所以復(fù)雜度為O(1)。

  1. public void insertLast(long value){ 
  2.     Node node = new Node(value); 
  3.     if(first == null){ 
  4.         first = node; 
  5.     }else
  6.         last.next = node; 
  7.         node.prev = last
  8.     } 
  9.     last = node; 

3.2.3 從頭部刪除結(jié)點

判斷頭結(jié)點是否有下一個結(jié)點,如果沒有則設(shè)置尾結(jié)點為null,否則設(shè)置頭結(jié)點的下一個結(jié)點的prev為null。復(fù)雜度也為O(1)。

  1. public Node deleteFirst(){ 
  2.  
  3.     Node tmp = first
  4.     if(first.next == null){ 
  5.         last = null
  6.     }else
  7.         first.next.prev = null
  8.     } 
  9.     first = tmp.next
  10.     return tmp; 

3.2.4 從尾部刪除結(jié)點

如果頭結(jié)點后沒有其他結(jié)點,則設(shè)置頭結(jié)點為null,否則設(shè)置尾結(jié)點的前一個結(jié)點的next為null,設(shè)置尾結(jié)點為前一個結(jié)點。復(fù)雜度為O(1)。

  1. public Node deleteLast(){ 
  2.  
  3.     Node tmp = last;  
  4.     if(first.next == null){ 
  5.         first = null
  6.     }else
  7.         last.prev.next = null;   
  8.     } 
  9.     last = last.prev; 
  10.     return last

四 總結(jié)

鏈表包含一個頭結(jié)點和多個結(jié)點,頭結(jié)點包含一個引用,這個引用通常叫做first,它指向鏈表的第一個鏈結(jié)點。結(jié)點的next為null,則意味著這個結(jié)點是尾結(jié)點。與數(shù)組相比,鏈表更適合做插入、刪除操作,而查找操作的復(fù)雜度更高。還有一個優(yōu)勢就是鏈表不需要初始化內(nèi)存大小,不會造成內(nèi)存溢出(數(shù)組中插入元素個數(shù)超過數(shù)組長度)或內(nèi)存浪費(聲明的數(shù)組長度比實際放的元素長)。

本文轉(zhuǎn)載自微信公眾號「Java旅途」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系Java旅途公眾號。

 

責任編輯:武曉燕 來源: Java旅途
相關(guān)推薦

2020-08-11 08:13:46

微服務(wù)

2010-09-09 15:05:27

2010-07-07 09:28:25

云計算虛擬化

2009-08-08 09:11:25

Windows 7MSDN版

2009-10-09 16:43:25

2019-05-05 09:24:09

KafkaTopicPartition

2010-06-23 10:24:42

Javascript閉

2011-04-29 09:51:05

投影機

2011-03-21 15:50:13

上網(wǎng)行為管理百卓網(wǎng)絡(luò)

2011-10-04 16:17:22

Flash

2021-06-02 07:02:42

js作用域函數(shù)

2009-07-28 09:02:22

2017-09-01 10:32:56

2014-06-26 11:14:35

Google IO 2014

2023-05-29 08:32:40

JAVA重寫重載

2021-04-12 15:06:10

AI 數(shù)據(jù)人工智能

2025-03-14 13:17:02

2012-02-09 18:54:22

2017-07-04 13:46:07

C9

2025-05-26 09:07:00

點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 一级黄色影片在线观看 | 日韩a在线| www.五月婷婷.com | 欧美日韩视频 | 免费久久久久久 | 国产精品久久久久久福利一牛影视 | 国产 亚洲 网红 主播 | 97操操 | 美女视频h | 精品一区二区久久久久久久网站 | 激情欧美一区二区三区中文字幕 | 亚洲国产精品久久久久婷婷老年 | 精品伊人 | 久久福利网站 | 日韩欧美国产精品一区 | 国产亚洲精品久久久久久豆腐 | 伊人成人免费视频 | 伊人网在线综合 | 免费精品视频 | 天天插天天干 | 天堂一区 | 天堂一区在线观看 | 欧美激情精品久久久久久免费 | 久久久久免费 | а_天堂中文最新版地址 | 午夜视频免费在线观看 | 久久久精品视 | 一级毛片在线播放 | 亚洲三区在线观看 | 国产欧美视频一区二区 | 久久久精彩视频 | 午夜精品久久久久久不卡欧美一级 | 成人在线视频一区 | 日韩三区 | 羞羞免费网站 | 81精品国产乱码久久久久久 | 成人在线免费观看 | 亚洲色图综合 | 成人一区二区三区在线观看 | 成人1区| 综合九九|