日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Java實現(xiàn)單鏈表、棧、隊列三種數(shù)據(jù)結(jié)構(gòu)

一、單鏈表

創(chuàng)新互聯(lián)建站于2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都做網(wǎng)站、網(wǎng)站建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元秦安做網(wǎng)站,已為上家服務(wù),為秦安各地企業(yè)和個人服務(wù),聯(lián)系電話:18982081108

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

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

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

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

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

不用在挪動后面元素。

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

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

3、下面通過代碼來實現(xiàn)單鏈表結(jié)構(gòu):

 
 
 
 
  1. package com.tlinkedList;  
  2. /**  
  3. * User:zhang  
  4. * Date:2020/10/26  
  5. **/  
  6. public class TLinkedList {  
  7.   private Node head;//鏈表頭部  
  8.   private int size;//鏈表元素的個數(shù)  
  9.   public TLinkedList(){  
  10.       head=null;  
  11.       size=0;  
  12.   }  
  13. //    將結(jié)點作為內(nèi)部類。也可以新建一個Node類,作為結(jié)點  
  14.   class Node{  
  15.       private Node next;//下一個結(jié)點  
  16.       private T t;//結(jié)點的數(shù)據(jù)  
  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. //    在鏈表頭部添加一個結(jié)點  
  28.   public void addFirst(T t){  
  29.       Node node = new Node(t);  
  30.       node.next=head;  
  31.       head=node;  
  32.       size++;  
  33.   }  
  34. //    在鏈表中間添加一個結(jié)點  
  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. //    在鏈表尾部添加一個結(jié)點  
  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. //    刪除鏈表的頭結(jié)點  
  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
  71.           qMid=mid;  
  72.           midmid=mid.next;  
  73.           j++;  
  74.       }  
  75.       qMid.next=mid.next;  
  76.       size--;  
  77.   }  
  78. //    刪除鏈表的尾結(jié)點  
  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.next= null;  
  87.       size--;  
  88.   }  
  89. //    獲取鏈表指定下標的結(jié)點  
  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
  97.           midmid=mid.next;  
  98.           j++;  
  99.       }  
  100.       return mid;  
  101.   }  
  102.   public static void main(String[] args) {  
  103.       TLinkedList 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.   }  

結(jié)果如下:

二、棧(Stack)

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

2、棧的應(yīng)用場景也非常多,比如將字符串反轉(zhuǎn)、jvm里面的棧區(qū)等等。

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

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

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

4、下面通過鏈表結(jié)構(gòu)實現(xiàn)棧結(jié)構(gòu):

 
 
 
 
  1. package com.tStack;  
  2. /**  
  3. * User:zhang  
  4. * Date:2020/10/26  
  5. **/  
  6. public class Test_Stack {  
  7.   private Node head;//棧的頭結(jié)點  
  8.   private int size;//棧的元素個數(shù)  
  9.   class Node{  
  10.       private Node next;//下一個結(jié)點  
  11.       private T t;//結(jié)點的數(shù)據(jù)  
  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 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("棧內(nèi)無值");  
  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. //    獲取棧里面元素的個數(shù)  
  82.   public int getSize(){  
  83.       return size;  
  84.   }  
  85. //    返回棧頂元素  
  86.   public T peek(){  
  87.       if (size==0){  
  88.           System.out.println("棧內(nèi)無值");  
  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.   }  

結(jié)果:

三、隊列(Queue)

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

2、我們常見的消息隊列就是隊列結(jié)構(gòu)實現(xiàn)的。

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

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

4、通過鏈表結(jié)構(gòu)實現(xiàn)隊列:

 
 
 
 
  1. package com.tQueue;  
  2. /**  
  3.  * User:zhang  
  4.  * Date:2020/10/26  
  5.  **/  
  6. public class TQueue {  
  7.     private Node front;//頭結(jié)點  
  8.     private Node tail;//尾結(jié)點  
  9.     private int size;//隊列中元素的個數(shù)  
  10.     class Node {  
  11.         private Node next;//下一個結(jié)點  
  12.         private T t;//結(jié)點的數(shù)據(jù)  
  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 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.     }  

結(jié)果:


本文名稱:Java實現(xiàn)單鏈表、棧、隊列三種數(shù)據(jù)結(jié)構(gòu)
網(wǎng)頁URL:http://www.5511xx.com/article/dhdeish.html