鏈表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 }