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

Java實現單鏈表、棧、隊列三種數據結構

開發 后端
本文介紹了單鏈表、棧、隊列三種數據結構。一起來看看吧。

一、單鏈表

1、在我們數據結構中,單鏈表非常重要。它里面的數據元素是以結點為單位,每個結點是由數據元素的數據和下一個結點的地址組成,在java集合框架里面  LinkedList、HashMap(數組加鏈表)等等的底層都是用鏈表實現的。

2、下面是單鏈表的幾個特點:

數據元素在內存中存放的地址是不連續的:單鏈表的結點里面還定義一個結點,它里面保存著下一個結點的內存地址,在實例化對象的時候,jvm會開辟不同內存空間,并且是不連續的。

添加效率高:添加一個元素時,先找到插入位置的前一個,只需要將1,2個元素的連接斷開,將插入結點的next指向第一個元素的next

(1),然后將第一個元素的next指向插入結點(2),

不用在挪動后面元素。

刪除效率高:刪除一個元素時,先找到刪除位置,將前一個的next指向刪除位置的next,不用在挪動后面元素。

查詢效率低:查詢的時候必須從頭開始,依次遍歷,而數組因為它的內存是連續的,可以直接通過索引查找。

3、下面通過代碼來實現單鏈表結構: 

  1. package com.tlinkedList;  
  2. /**  
  3. * User:zhang  
  4. * Date:2020/10/26  
  5. **/  
  6. public class TLinkedList<T> {  
  7.   private Node head;//鏈表頭部  
  8.   private int size;//鏈表元素的個數  
  9.   public TLinkedList(){  
  10.       head=null 
  11.       size=0 
  12.   }  
  13. //    將結點作為內部類。也可以新建一個Node類,作為結點  
  14.   class Node{  
  15.       private Node next;//下一個結點  
  16.       private T t;//結點的數據  
  17.       public Node(T t){  
  18.           tthis.t=t;  
  19.       }  
  20.       public T getT() {  
  21.           return t;  
  22.       }  
  23.       public void setT(T t) {  
  24.           tthis.t = t;  
  25.       }  
  26.   }  
  27. //    在鏈表頭部添加一個結點  
  28.   public void addFirst(T t){  
  29.       Node node = new Node(t);  
  30.       node.next=head 
  31.       head=node 
  32.       size++;  
  33.   }  
  34. //    在鏈表中間添加一個結點  
  35.   public void addMid(T t,int index){  
  36.       Node node = new Node(t);  
  37.       Node mid=head 
  38.       for (int i = 0; i < index - 1; i++) {  
  39.           midmid=mid.next;  
  40.       }  
  41.       node.next=mid.next;  
  42.       mid.next=node 
  43.       size++;  
  44.   }  
  45. //    在鏈表尾部添加一個結點  
  46.   public void addLast(T t){  
  47.       Node node = new Node(t);  
  48.       Node last=head 
  49.       while (last.next!=null){  
  50.           lastlast=last.next;  
  51.       }  
  52.       last.next=node 
  53.       node.next=null 
  54.       size++;  
  55.   }  
  56. //    刪除鏈表的頭結點  
  57.   public void removeFirst(){  
  58.       headhead=head.next;  
  59.       size--;  
  60.   }  
  61. //    刪除鏈表的中間元素  
  62.   public void removeMid(int index){  
  63.       Node mid=head 
  64.       if (index==0){  
  65.           removeFirst();  
  66.           return;  
  67.       }  
  68.       int j=0 
  69.       Node qMid=head 
  70.       while (j<index){  
  71.           qMid=mid 
  72.           midmid=mid.next;  
  73.           j++;  
  74.       }  
  75.       qMid.next=mid.next;  
  76.       size--;  
  77.   }  
  78. //    刪除鏈表的尾結點  
  79.   public void removeLast(){  
  80.       Node mid=head 
  81.       Node qMid=head 
  82.       while (mid.next!=null){  
  83.            qMid=mid 
  84.            midmid=mid.next;  
  85.       }  
  86.       qMid.nextnull 
  87.       size--;  
  88.   }  
  89. //    獲取鏈表指定下標的結點  
  90.   public Node get(int index){  
  91.       Node mid=head 
  92.       if (index==0){  
  93.           return head;  
  94.       }  
  95.       int j=0 
  96.       while (j<index){  
  97.           midmid=mid.next;  
  98.           j++;  
  99.       }  
  100.       return mid;  
  101.   }  
  102.   public static void main(String[] args) {  
  103.       TLinkedList<String> linkedList = new TLinkedList<>();  
  104.       linkedList.addFirst("hello1");  
  105.       linkedList.addFirst("hello2");  
  106.       linkedList.addFirst("hello3");  
  107.       for (int i = 0; i < linkedList.size; i++) {  
  108.           System.out.println(linkedList.get(i).getT());  
  109.       }  
  110. //        linkedList.removeLast();  
  111. //        linkedList.removeFirst();  
  112. //        linkedList.addLast("hello4");  
  113.       linkedList.addMid("hello",2);  
  114.       System.out.println("--------------");  
  115.       for (int i = 0; i < linkedList.size; i++) { 
  116.           System.out.println(linkedList.get(i).getT());  
  117.       }  
  118.   }  

結果如下:

二、棧(Stack)

1、一提到棧我們腦海就會浮現四個字“先進后出”,沒錯,它就是棧的最大特點。

2、棧的應用場景也非常多,比如將字符串反轉、jvm里面的棧區等等。

3、棧里面的主要操作有:

  •  push(入棧):將一個數據元素從尾部插入
  •  pop(出棧):將一個數據元素從尾部刪除
  •  peek(返回棧頂元素):將棧頂元素的數據返回

相當于只有一個開口就是尾部,只能從尾進,從尾出。

4、下面通過鏈表結構實現棧結構: 

  1. package com.tStack;  
  2. /**  
  3. * User:zhang  
  4. * Date:2020/10/26  
  5. **/  
  6. public class Test_Stack<T> {  
  7.   private Node head;//棧的頭結點  
  8.   private int size;//棧的元素個數  
  9.   class Node{  
  10.       private Node next;//下一個結點  
  11.       private T t;//結點的數據  
  12.       public Node(T t){  
  13.           tthis.t=t;  
  14.       }  
  15.       public T getT() {  
  16.           return t; 
  17.       }  
  18.       public void setT(T t) {  
  19.           tthis.t = t;  
  20.       }  
  21.   }  
  22.   public Test_Stack() {  
  23.       head=null 
  24.       size=0 
  25.   }  
  26.   public static void main(String[] args) {  
  27.       Test_Stack<String> TStack = new Test_Stack<>();  
  28.       TStack.push("hello1");  
  29.       TStack.push("hello2");  
  30.       TStack.push("hello3");  
  31.       for (int i = 0; i < 3; i++) {  
  32.           System.out.println(TStack.pop());  
  33.       }  
  34.   }  
  35. //    入棧  
  36.   public void push(T t){  
  37.       Node node = new Node(t);  
  38.       if (size==0){  
  39.           node.next=head 
  40.           head=node 
  41.           size++;  
  42.           return;  
  43.       }  
  44.       if (size==1){  
  45.           head.next=node 
  46.           node.next=null 
  47.           size++;  
  48.           return;  
  49.       }  
  50.       Node lastNode=head 
  51.       while (lastNode.next!=null){  
  52.            lastNodelastNode=lastNode.next;  
  53.       }  
  54.       lastNode.next=node 
  55.       node.next=null 
  56.       size++;  
  57.   }  
  58. //    出棧  
  59.   public T pop(){  
  60.       if (size==0){  
  61.           System.out.println("棧內無值");  
  62.           return null;  
  63.       }  
  64.       if (size==1){  
  65.           T t = head.getT();  
  66.           head=null 
  67.           size--;  
  68.           return t;  
  69.       }  
  70.       Node lastNode=head 
  71.       Node qNode=head 
  72.       while (lastNode.next!=null){  
  73.           qNode=lastNode 
  74.           lastNodelastNode=lastNode.next;  
  75.       }  
  76.       T t = lastNode.getT();  
  77.       qNode.next=null 
  78.       size--;  
  79.       return t;  
  80.   }  
  81. //    獲取棧里面元素的個數  
  82.   public int getSize(){  
  83.       return size;  
  84.   }  
  85. //    返回棧頂元素  
  86.   public T peek(){  
  87.       if (size==0){  
  88.           System.out.println("棧內無值");  
  89.           return null;  
  90.       }  
  91.       if (size==1){  
  92.           return head.getT();  
  93.       }  
  94.       Node lastNode=head 
  95.       while (lastNode.next!=null){  
  96.           lastNodelastNode=lastNode.next;  
  97.       }  
  98.       return lastNode.getT();  
  99.   }  

結果:

三、隊列(Queue)

1、隊列的特點也用“先進先出”四個字來概括。就是先進去的元素先輸出出來。

2、我們常見的消息隊列就是隊列結構實現的。

3、隊列的常見操作如下:

  •  put(入隊):將一個結點插入到尾部。
  •  pop(出隊):將頭結點的下一個結點作為頭,然后將原來的頭結點刪除。

4、通過鏈表結構實現隊列: 

  1. package com.tQueue;  
  2. /**  
  3.  * User:zhang  
  4.  * Date:2020/10/26  
  5.  **/  
  6. public class TQueue<T> {  
  7.     private Node front;//頭結點  
  8.     private Node tail;//尾結點  
  9.     private int size;//隊列中元素的個數  
  10.     class Node {  
  11.         private Node next;//下一個結點  
  12.         private T t;//結點的數據  
  13.         public Node(T t) {  
  14.             tthis.t = t; 
  15.         }  
  16.         public T getT() {  
  17.             return t;  
  18.         }  
  19.         public void setT(T t) {  
  20.             tthis.t = t;  
  21.         }  
  22.     }  
  23.     public int getSize() {  
  24.         return size;  
  25.     }  
  26.     public void setSize(int size) {  
  27.         this.size = size;  
  28.     }  
  29.     public TQueue() {  
  30.         front = tail = null;  
  31.     }  
  32.     //    入隊  
  33.     public void put(T t) {  
  34.         Node node = new Node(t);  
  35.         if (size == 0) {  
  36.             front = tail = node;  
  37.             size++;  
  38.             return; 
  39.          }  
  40.         Node lastNode = front 
  41.         while (lastNode.next != null) {  
  42.             lastNodelastNode = lastNode.next;  
  43.         }  
  44.         lastNode.next = node 
  45.         tail = node 
  46.         size++;  
  47.     }  
  48.     //    出隊  
  49.     public T pop() {  
  50.         if (size == 0) {  
  51.             System.out.println("隊列中無值");  
  52.             return null;  
  53.         }  
  54.         T t = front.getT();  
  55.         frontfront=front.next;  
  56.         size--;  
  57.         return t;  
  58.     }   
  59.     public static void main(String[] args) {  
  60.         TQueue<String> tQueue = new TQueue<>();  
  61.         tQueue.put("Hello1");  
  62.         tQueue.put("Hello2");  
  63.         tQueue.put("Hello3");  
  64.         for (int i = 0; i < 3; i++) {  
  65.             System.out.println(tQueue.pop());  
  66.         }  
  67.     }  

結果:

 

 

責任編輯:龐桂玉 來源: Java知音
相關推薦

2023-03-06 08:40:43

RedisListJava

2021-07-13 07:52:03

Python數據結構

2020-12-17 10:12:33

數據結構算法隊列

2012-05-16 17:05:33

Java數據結構

2023-04-11 08:00:56

Redis類型編碼

2012-02-02 10:21:05

單鏈表nexthead

2021-03-10 08:42:19

Java數據結構算法

2020-12-28 10:35:38

前端數據技術

2025-01-13 06:10:00

2025-05-13 08:05:00

Redis數據類型數據庫

2019-10-29 08:59:16

Redis底層數據

2020-03-27 14:29:30

數據結構

2021-08-03 10:24:59

數據跳躍鏈表結構

2010-09-26 16:31:13

隨機查詢語句

2021-05-12 14:09:35

鏈表數據結構線性結構

2023-09-06 13:16:00

數據庫數據

2011-04-11 11:23:17

隊列數據結構

2021-03-01 23:31:48

隊列實現棧存儲

2023-09-25 12:23:18

Python

2021-03-29 08:01:20

JavaScript數據結構
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一二三在线 | 日韩欧美电影在线 | 久久国内精品 | 亚洲一区二区精品视频 | 91pao对白在线播放 | 91国自产 | 在线观看视频一区 | 蜜桃视频麻豆 | 亚洲精品日韩视频 | 久久爱黑人激情av摘花 | 免费在线观看黄网站 | 日韩成人精品在线 | 中文字幕一区二区三区乱码图片 | 可以在线观看av的网站 | 欧美日韩成人影院 | 一区二区精品 | 国产成人免费 | 91欧美激情一区二区三区成人 | 亚洲综合大片69999 | 97国产精品 | www.狠狠干 | 麻豆a级片| 国产精品久久国产精品 | 亚洲国产成人精品女人久久久 | 国产成人精品久久二区二区91 | www.4567| 国产精品99久久久久久久vr | 国产精品一区二区在线 | 中文字幕av在线一二三区 | 午夜三级视频 | 午夜影院视频 | 丁香综合 | 欧美精品一区二区三区在线播放 | 蜜桃视频在线观看免费视频网站www | www.日韩| 91精品国产自产精品男人的天堂 | 日本黄色大片免费 | 欧美一区二区三区在线免费观看 | av日日操 | 91久久精品日日躁夜夜躁国产 | 亚洲视频在线播放 |