程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 鏈表java實現

鏈表java實現

編輯:關於JAVA

鏈表java實現。本站提示廣大學習愛好者:(鏈表java實現)文章只能為提供參考,不一定能成為您想要的結果。以下是鏈表java實現正文


鏈表是用指針將多個節點聯系在一起,通過頭節點和尾節點還有節點數量,可以對鏈表進行一系列的操作。是線性表的鏈式存儲實現。

1.鏈表是多個不連續的地址組成在一起根據指針鏈接在一起的,由多個節點組成,每個節點包括元素域和指針域
2.元素域存儲節點數組,指針域存儲下一節點指針
3.我們對鏈表的操作都是間接的通過鏈表頭節點操作來實現的
4.一個鏈表中有多個節點,一個節點包括元素域,和下一節點指針域
5.最左邊的節點是頭節點,但是添加節點是從右到左添加,新添加的節點會被作為頭節點
6.鏈表是由不定數量的節點連接(通過相互之間的引用)起來的,由於這種關系,在鏈表裡我們只定義了頭節點和節點數量。節點是由存儲的對象及對下一個“節點”的引用封裝而成。
7.在添加節點到鏈表中時,首先添加的節點後置後,新添加的節點作為頭節點引用前一個添加的節點。

//先創建一個節點類

 1 package linkedList;
 2 //節點類
 3 public class Node<E> {
 4     protected Object data =  null;     //數據域
 5     protected Node<E> next = null;  //指針域
 6     
 7     //初始化數據域
 8     public Node(E e, Node<E> next) {
 9         this.data = e;    //初始化數據域
10         this.next = next; //初始化指針域
11     }
12     
13     //顯示節點,獲取當前實體對象,數據域
14     public Object getData(){
15         return this.data;
16     }
17     
18     //獲取下一個實體,指針域
19     public Node<E> getNext(){
20         return this.next;
21     }
22     
23     @Override
24     public String toString() {
25         return "Node [data=" + data + ", next=" + next + "]";
26     }
27     
28 }


//然後創建我們的鏈表類,將節點作為鏈表的屬性

  1 package linkedList;
  2 
  3 import java.util.ArrayList;
  4 import java.util.List;
  5 
  6 /**
  7  * 1.鏈表是多個不連續的地址組成在一起根據指針鏈接在一起的,由多個節點組成,每個節點包括元素域和指針域
  8  * 2.元素域存儲節點數組,指針域存儲下一節點指針
  9  * 3.我們對鏈表的操作都是間接的通過鏈表頭節點操作來實現的
 10  * 4.一個鏈表中有多個節點,一個節點包括元素域,和下一節點指針域
 11  * 5.最左邊的節點是頭節點,但是添加節點是從右到左添加,新添加的節點會被作為頭節點
 12  * 6.鏈表是由不定數量的節點連接(通過相互之間的引用)起來的,由於這種關系,在鏈表裡我們只定義了頭節點和節點數量。節點是由存儲的對象及對下一個“節點”的引用封裝而成。
 13  * 7.在添加節點到鏈表中時,首先添加的節點後置後,新添加的節點作為頭節點引用前一個添加的節點。
 14  * @author LH-PC
 15  *
 16  */
 17 public class LinkedList<E> implements java.io.Serializable{
 18     private static final long serialVersionUID = 1L;
 19     
 20     private Node<E> head; //頭節點
 21     private int size;     //節點數量,即鏈表長度
 22     
 23 
 24     //添加頭節點 在添加鏈表節點時,首先添加的節點(頭節點)後置,新添加的節點變成頭節點,並且執向前一個頭節點
 25     public void addNode(E e){
 26         //判斷鏈表中有無該對象:從頭節點開始遍歷,匹配有無此對象
 27         //如果有頭節點,則添加新的節點為頭節點,新的頭節點指向上一個頭節點
 28         if(head != null){
 29             System.out.println("鏈表中已經存在頭節點, 正在添加新的頭節點:" + e);
 30             System.out.println("添加成功! 此頭節點指向->" + head.data);
 31             this.head = new Node<E>(e, head);  //將新添加的節點作為頭節點,指針域指向上一個頭節點
 32             size ++; //節點數量++
 33             
 34         }else {
 35             //如果沒有頭節點,則添加新的對象作為頭節點,第一個頭節點指向null
 36             System.out.println("鏈表中不存在頭節點,正在添加頭節點:" + e);
 37             this.head = new Node<E>(e, null);
 38             System.out.println("添加成功!頭節點指向->" + null);
 39             size ++; //節點數量++
 40         }
 41     }
 42     
 43     //在指定位置插入節點
 44     public int insert(int index, E e){
 45         Node<E> temp = this.head;
 46         int i = 0;
 47         if(index < i || i > this.size){
 48             System.err.println("索引大於鏈表長度或者小於0:" + index);
 49             return -1;
 50         }
 51         
 52         if(index == 0){ 
 53             //如果index == 0,插入到頭節點之後
 54             this.head.next = new Node<E>(e, head.next);  //將頭節點指向新節點,將新節點指向原來頭節點的下一個節點
 55             size ++; //節點數量加1
 56             return 1;
 57         }
 58         
 59         //遍歷鏈表
 60         while(temp != null){
 61             //運動到了指定位置
 62             if(index == i){
 63                 temp.next = new Node<E>(e, temp.next);    //將插入進來的指針域指向當前節點,將當前節點的上一個節點指針域指向當前節點
 64                 size ++; //節點長度加1
 65                 break;
 66             }
 67             temp = temp.next; //向下一個節點運動
 68             i ++;
 69         }
 70         
 71         return 1;
 72     }
 73     
 74     //刪除頭節點
 75     public void deleteByHead(){
 76         //1.找到頭節點。this.head
 77         //2.更新頭節點。將當前鏈表頭節點設置為刪除頭節點的指針域
 78         //3.鏈表節點數量-1
 79         System.out.println("正在刪除頭節點:" + this.head.getData());
 80         this.head = this.head.next; //更新頭節點為下一節點
 81         size --; //節點數量-1
 82         System.out.println("刪除成功");
 83 
 84     }
 85     
 86     //刪除指定位置的節點
 87     public void deleteByIndex(int index){
 88         //找到指定位置的前一個節點,將前一個節點指向後面兩個節點。中間的節點就將被刪除了。
 89         Node<E> temp = this.head;
 90         int i = 0;
 91         if(index < i || index > this.size){
 92             System.err.println("索引不能小於0或大於鏈表長度:" + index);
 93             return;
 94         }
 95         
 96         //如果索引為0,表示刪除頭節點
 97         if( index == 0){
 98             this.deleteByHead(); //調用刪除頭節點方法
 99             return;
100         }
101         
102         //遍歷鏈表
103         while(temp != null){
104             //找到目標節點的上一個節點
105             if(index-1 == i){
106                 System.out.println("正在刪除節點:" + this.head.next.getData());
107                 temp.next = temp.next.next;
108                 System.out.println("刪除成功");
109                 size --; //節點數減1
110                 return;
111             }
112             temp = temp.next; //繼續遍歷
113             i ++;
114         }
115         
116     }
117     
118     //更新指定位置的節點
119     public void updateByIndex(int index, E e){
120         if(index < 0 || index > this.size){
121             System.err.println("索引小於0或者大於鏈表長度:" + index);
122         }
123         
124 //        if(index == 0){
125 //            this.updateByHead(e); //如果index==0,更新頭節點
126 //        }
127         
128         //遍歷鏈表
129         int i = 0;
130         Node<E> temp = this.head;
131         while(temp != null){
132             if(index == i){
133                 temp.data = e;
134                 break;
135             }
136             temp = temp.next;
137             i ++;
138         }
139 
140     }
141     
142     //更新頭節點
143     public void updateByHead(E e){
144         this.head.data = e; //為頭節點重新賦值
145     }
146     
147     //打印鏈表中的所有數據 從頭節點一直到尾節點。 (1).head  (2).head.next (3).head.next.next (n).head.next.n.n
148     public void display(){
149         Node<E> temp = this.head;
150         //從頭節點開始遍歷到為尾節點
151         while(temp != null){
152             System.out.println(temp.getData());
153             temp = temp.next;  //指向下一節點。
154         }
155     }
156     
157     //返回鏈表list
158     public List<Node<E>> findAll(){
159         List<Node<E>> list = new ArrayList<Node<E>>();
160         Node<E> temp = this.head;
161         while(temp != null){
162             list.add(temp);
163             temp = temp.next;
164         }
165         return list;
166     }
167     
168     //查找指定位置結點
169     public Node<E> findByIndex(int index){
170         Node<E> temp = this.head;
171         int i = 0;
172         
173         //參數校驗,返回null
174         if(index < i || index > this.size){
175             System.err.println("參數大於鏈表長度或者小於0:" + index);
176             return null;
177         }
178         
179         //如果index == 0,返回頭節點
180         if(index == 0){
181             return this.head;  //如果下標為1,直接返回頭節點
182         }
183         
184         //遍歷鏈表進行匹配
185         while(temp != null){
186             if(i == index){
187                 return temp; //匹配節點
188             }
189             temp = temp.next; //繼續遍歷
190             i ++;
191         }
192         return null;
193     }
194     
195     //獲得鏈表節點數量
196     public int getSize(){
197         return this.size;
198     }
199     
200     //獲取當前頭節點
201     public Node<E> getHead(){
202         return this.head;
203     }
204     
205     //測試我的鏈表
206     public static void main(String[] args) {
207             LinkedList<Integer> linkedList = new LinkedList<Integer>();
208             
209             //添加節點
210             linkedList.addNode(1);
211             linkedList.addNode(2);
212             linkedList.addNode(3);
213             linkedList.addNode(4);
214             linkedList.addNode(5);
215             linkedList.addNode(6);
216             
217             linkedList.insert(6, 9);
218             linkedList.updateByIndex(6, 9);
219             linkedList.display();
220 
221     }
222 
223 }

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved