Java實現單鏈表

  剛開始學習java不久的時候覺得java沒有指針。。。不知道怎麼弄鏈表,最近才頓悟完成這個簡單的鏈表。。。實現這個鏈表類讓我感受面向對象思想更進一步,建議本身看了思路本身作。(我就是o(^▽^)o)java

  java中有基本數據類型和引用數據類型(其實就是指針)。若是對引用不夠了解請訪問   http://zwmf.iteye.com/blog/1738574 (我以爲寫得特別好,就不必重複了)。ide

實現鏈表的思路:函數

  1)鏈表類,結點類(鏈表類的內部類),在main()方法建立一條鏈表類對象,經過方法逐步建立結點類,經過引用連接起來成爲鏈表。學習

  2)結點類包含數據和對下個結點的引用,以及能夠對數據賦值的構造函數。this

  3)鏈表類的構造方法,只構造出不含數據的頭結點。(外部類能夠直接對內部類的私有成員進行訪問,這樣就能夠直接修改引用)spa

主體代碼:指針

1 public  class MyLink<E>{
2     private class Node{
3             privare Object data;         //保存數據
4             private Node next;           //對下個結點的引用
5         }  
6 }
MyLink

 

完整版代碼(鏈表下標從0開始):code

 

  1 package myLink;
  2 
  3 public class MyLink<E> {          //使用泛型是爲了使用時候能夠規範鏈表的數據類型
  4     // 結點內部類
  5     private class Node {
  6         private Object data;                  //數據
  7         private Node next = null;          //指向下個結點的引用
  8 
  9         public Node() {                         //無參數構造函數爲了建立頭結點服務
 10             data = null;
 11         }
 12 
 13         public Node(E data) {                //帶數據的構造函數
 14             this.data = data;
 15         }
 16 
 17     }
 18 
 19     private Node head;               // 頭引用(指針)
 20     private Node rear;                // 尾引用(指針)
 21     private Node point;              //臨時引用(指針)
 22     private int length;                 // 鏈表長度
 23 
 24     public MyLink() {                  //鏈表構造函數,建立無數據的頭結點
 25         head = new Node();     
 26         rear = head;
 27         length = 0;
 28     }
 29 
 30     /**
 31      * 從尾部插入鏈表
 32      * 
 33      */
 34     public void add(E elem) {
 35         point = new Node(elem);
 36         rear.next = point;
 37         rear = point;
 38         length++;
 39 
 40     }
 41 
 42     /**
 43      * 遍歷輸出鏈表
 44      */
 45     public void traverse() {
 46         point = head;            //移動臨時引用到頭結點
 47         if (head != null)
 48             System.out.print("[" + head.data + "]");
 49         while (point.next != null) {
 50             System.out.print("-➜[" + point.next.data + "]");
 51             point = point.next;
 52         }
 53         System.out.println();
 54     }
 55 
 56     /**
 57      * 得到鏈表長度
 58      * 
 59      */
 60     public int length() {
 61         return length;
 62     }
 63 
 64     /**
 65      * 清除鏈表內容
 66          * (java垃圾回收,當對象沒有引用指向,則視爲垃圾,清理時機由系統決定)
 67      */
 68     public void clear() {               
 69         while (head.next != null) {
 70             head.next = head.next.next;
 71         }
 72         rear = head;      // 回到初始狀態
 73         point = null;
 74         length = 0;
 75         System.gc();      //請求系統清理垃圾,未必有用
 76     }
 77 
 78     /**
 79      * 在指定個位置插入元素成爲第p個元素
 80      */
 81     public void insert(int position, E elem) {
 82                 if(position>=0 && position<=length){
 83             point = movePoint(position);
 84             Node tmp = new Node(elem);
 85             tmp.next = point.next;
 86             point.next = tmp;
 87             length++;
 88                }else{
 89                     System.out.println("沒有指定位置,插入失敗")
 90                }
 91 
 92     }
 93 
 94     /**
 95      * 刪除指定位置的元素
 96      */
 97     public void remove(int position) {
 98         if (position >= 0 && position < length) {
 99             point = movePoint(position);
100             Node tmp = point.next;
101             point.next = tmp.next;
102             length--;
103         } else {
104             System.out.println("刪除失敗,沒有指定位置元素");
105         }
106     }
107 
108     /**
109      * 更改指定位置的元素
110      */
111     public void set(int position, E elem) {
112         if (position >= 0 && position < length) {
113             point = movePoint(position);
114             point.next.data = elem;
115         } else {
116             System.out.println("修改失敗,沒有指定位置元素");
117         }
118     }
119 
120     /**
121      * 移動指針到指定位置
122          * 私有方法,供其它方法使用
123      */
124     private Node movePoint(int position) {
125         if (position < 0)                    //若是參數小於零,則移動到頭部,原本是爲了規避參數錯誤問題,但在使用此方法的其餘方法皆有作其餘處理,可刪除
126             return head;
127         if (position > length)            //若是參數大於長度,則移動到尾部,同上,可刪除
128             return rear;
129 
130         if (position >= 0 && position <= length) {
131             point = head;
132             while (point != null) {
133                 if (position == 0)
134                     break;
135                 position--;
136                 point = point.next;
137             }
138         }
139 
140         return point;
141 
142     }
143 
144     /**
145      * 鏈接兩條鏈表
146          * 已知問題,兩鏈表的數據類型不必定相同,憑我目前實力沒法理解解決(如何獲取泛型實際類型)
147      */
148     public void connect(MyLink b) {
149         this.rear.next = b.head.next;
150         this.length += b.length;
151         b.head = null;
152     }
153 
154     /**
155      * 按下標查找
156      */
157     public E find(int position) {
158         if (position >= 0 && position < length) {
159             Node tmp = movePoint(position);
160             return (E) tmp.next.data;
161         }
162         return null;
163     }
164 
165     /**
166      * 查找元素的值,返回下標
167      */
168     public int search(E elem) {
169         point = head.next;
170         int idex = -1;
171         while (point != null) {
172             idex++;
173             if (point.data == elem)
174                 break;
175             point = point.next;
176         }
177         return idex;
178 
179     }
180 }
View Code

 

撰寫時間:2017-07-27 21:03:19對象

修改時間:blog

感受有些地方處理的很差,很粗糙,未來慢慢改進吧。

若代碼有什麼不足,不吝賜教。

相關文章
相關標籤/搜索