所謂雙向鏈表:

(由此圖可見老夫深厚的畫功)
鏈表,就是由一個一個的節點連接組成。
在這里,每一個節點都是由三部分組成:上一個節點、當前節點的元素、下一個節點

當鏈表中只有一個節點的時候,這個節點指向的上一個節點是空的,下一個節點也是空的

當有多個節點的時候,第一個節點的上一個節點是空的,最后一個節點的下一個節點也是空的。
如上圖:A節點的下一個節點指向了B節點,B節點的上一個節點指向了A節點
不說了...鑒于本人表達能力有限...直接上代碼吧...
1 public class MyLinkedList { 2 /*第一個節點*/ 3 PRivate Node first; 4 /*最后一個節點*/ 5 private Node last; 6 /*大小*/ 7 private int size; 8 /** 9 * 獲取這個鏈表的大小(元素的個數) 10 * @return 11 */ 12 public int size(){ 13 return size; 14 } 15 /** 16 * 這個方法是從LinkedList.node(index)方法中復制過來的,稍加修改 17 * 用于返回指點下標處的節點 18 * @return 19 */ 20 private Node node(int index){ 21 /* 22 * 打個比方: 23 * size = 6; 24 * size >> 1 = 3 25 * 如果index小于3的話,就從第一個找到最后一個 26 * 如果index大于3的話,就從最后一個找到第一個 27 * 下面代碼亦是如此 28 */ 29 if (index < (size >> 1)) { 30 Node x = first; 31 for (int i = 0; i < index; i++) 32 x = x.next; 33 return x; 34 } else { 35 Node x = last; 36 for (int i = size - 1; i > index; i--) 37 x = x.prev; 38 return x; 39 } 40 } 41 /** 42 * 增加一個節點 43 * @param obj 要增加的元素 44 */ 45 public void add(Object obj){ 46 Node temp = new Node();//新的節點 47 /*新節點的元素賦值*/ 48 temp.element = obj; 49 50 if (first==null) {//如果第一個節點是空的,那就是沒有節點 51 //這個節點既然是第一個節點,所以節點的prev點和next都是空的,所以,不用賦值 52 //同理,這個新插入的節點是第一個,也是最后一個 53 first = temp; 54 last = temp; 55 }else {//否則,那就意味著這個節點不是空的。 56 //新節點的prev就是在這個節點插入前的最后一個節點 57 temp.prev = last; 58 //而插入前的最后一個節點的next就是這個新的節點了 59 //這樣,就會形成一條鏈:a的下一個是b,b的上一個是a,a的下一個是b...... 60 last.next = temp; 61 //最后,新的節點就是最后一個節點了 62 last = temp; 63 } 64 //插入成功size++; 65 size++; 66 } 67 /** 68 * 增加一個節點,指定位置 69 * @param index 70 * @param obj 71 */ 72 public void add(int index, Object obj){ 73 Node temp = node(index);//得到的節點 74 Node newNode = new Node();//新的節點 75 newNode.element = obj; 76 77 if (temp!=null) {//如果得到的指定節點不是空的話 78 //得到temp的上一個節點 79 Node tempPrev = temp.prev; 80 81 82 //tempPrev的下一個節點賦值為newNode 83 tempPrev.next = newNode; 84 //同時,newNode的上一個節點賦值為tempPrev 85 newNode.prev = tempPrev; 86 87 88 //然后newNode的下一個節點便是這個一開始就指定的temp節點 89 newNode.next = temp; 90 //temp的上一個節點賦值為newNode 91 //這樣在指定元素之前插入了一個新的元素 92 temp.prev = newNode; 93 } 94 size++; 95 } 96 /** 97 * 刪除 98 * @param index 99 */100 public void remove(int index){101 /*102 * 刪除...103 * 有 a b c三個元素104 * a的下一個節點是b b的下一個節點是c105 * c的上一個節點是b b的上一個節點是a106 * --107 * 比如刪除了b108 * 那就要把a 和 c 連接起來。109 * 110 * 連接好了后,就是:111 * a 下一個節點是 c112 * c 上一個節點是 a113 * 114 */115 116 Node temp = node(index);//得到指定下標的元素117 if (temp!=null) {118 /*119 120 //得到temp的上一個節點121 Node tempPrev = temp.prev;122 //得到temp的下一個節點123 Node tempNext = temp.next;124 //tempPrev的下一個節點是tempNext125 tempPrev.next = tempNext;126 //而tempNext的上一個節點就是tempPrev127 tempNext.prev = tempPrev;128 129 */130 131 //temp的上一個節點的下一個節點就是temp的下一個節點132 temp.prev.next = temp.next;133 //temp的下一個節點的上一個節點就是temp的上一個節點134 temp.next.prev = temp.prev;135 }136 size--;137 }138 /**139 * 根據下標獲取元素140 * @param index 元素的索引141 * @return142 */143 public Object get(int index){144 return node(index).element;//得到指定節點的元素145 }146 /*------------------------------------------------------------*/147 public static void main(String[] args) {148 MyLinkedList list = new MyLinkedList();149 list.add("a");150 list.add("b");151 list.add(1,"B");152 list.remove(1);153 System.out.println(list.get(1));154 System.out.println("當前鏈表的大?。?+list.size());155 }156 }157 /**158 * 節點類159 */160 class Node{161 /*162 * 表示上一個節點163 * 所以使用節點類型164 */165 Node prev;166 /*表示下一個節點*/167 Node next;168 /*當前節點的元素*/169 Object element;170 171 public Node() {172 }173 174 public Node(Node prev, Node next, Object element) {175 this.prev = prev;176 this.next = next;177 this.element = element;178 }179 180 }
新聞熱點
疑難解答