国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

LinkedList:雙向鏈表與實現

2019-11-14 15:08:38
字體:
來源:轉載
供稿:網友

所謂雙向鏈表:

  

(由此圖可見老夫深厚的畫功)

鏈表,就是由一個一個的節點連接組成。

在這里,每一個節點都是由三部分組成:上一個節點、當前節點的元素、下一個節點

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

當有多個節點的時候,第一個節點的上一個節點是空的,最后一個節點的下一個節點也是空的。

如上圖: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 }

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 布尔津县| 三台县| 平罗县| 阳曲县| 巴中市| 德惠市| 瓮安县| 那坡县| 建瓯市| 长治市| 金坛市| 城步| 上犹县| 江都市| 娄底市| 九江市| 图木舒克市| 马公市| 新泰市| 岳阳市| 海原县| 绥滨县| 烟台市| 尚志市| 达拉特旗| 东乌| 高陵县| 丰宁| 东宁县| 阳曲县| 龙门县| 瑞丽市| 罗平县| 江达县| 元朗区| 江西省| 招远市| 桂林市| 甘德县| 资源县| 明星|