Java 鏈表的使用
淺談自己學習鏈表之後的理解:
鏈表是一種重要的資料結構,有單鏈表和雙鏈表之分
單鏈表(單向鏈表):由兩部分組成 資料域(Data)和結點域(Node),單鏈表就像是一條打了很多結的繩子,每一個繩結相當於一個結點,每個節結點間都有繩子串連,這樣原理的實現是通過Node結點區的頭指標head實現的,每個結點都有一個指標,每個節點指標的指向都是指向自身結點的下一個結點,最後一個結點的head指向為null,這樣一來就連成了上述所說繩子一樣的鏈,對單鏈表的操作只能從一端開始,如果需要尋找鏈表中的某一個結點,則需要從頭開始進行遍曆。
單鏈表的操作:
添加:上圖可以看出 單向鏈表只有一個指向,原來head為p,p指向s,添加結點只需要把p指向q,q指向s就可以了,即:p--->q ; q--->s ; 這樣就實現了單向鏈表的添加;
刪除:原理與添加相反,若此時鏈表為 p---> q --->s ; 若刪除q節點只需要更改p的指向就可以了 p--->s,這樣就刪掉了;
尋找:尋找操作需要對整個但鏈表進行遍曆,直到滿足尋找條件為止;
修改:此操作一般建立在尋找之上進行,找到借點之後對值進行修改;
首先構建一個節點類,設定一個資料區和節點區
使用構造方法便於使用
public class Node{public Node data;//資料區public Node next; //指標區public Node (Node data,Node next){this.data = data ;this.next = next;}public Node(){}public void setData(Node data){this.data = data;}public Node getData(){ return data;}public void setNext(Node next){this.next=next;}public Node getNext(){return next;}}public class LinkList{public Node head;//前端節點public int count;//記錄節點的長度public LinkList(){//建構函式用來初始化head = null;count = 0;}//節點的添加public void addNode(Node data){Node node = new Node(data,null);Node temp = null;If(head!= null){temp = head;while(temp.getNext()!=null){Temp = temp.getNext();}temp.setNext(node);}else{head = node;temp = node;}count++;}//節點的刪除public void delNode(Node data){Node front = null;//定義一個空節點,用於接收和判斷被刪除節點的前面還有沒有節點while(head!= null){If(head.equals(data)){break;}front=head;head = head.getNext();}If(head!=null){If(front==null){head = head.getNext();}else{front.setNext(head.getNext());}count--;}else{Count--;}}//給定下標刪除節點public void delNode_count(int index){if(index<0||index>count-1){System.out.println("鏈表索引越界");}Node temp = head;//作用同上//找到要刪除節點的前一個節點for(int i=0;i<index-1;i++){temp=temp.getNext();}//找到之後 此節點的前節點和此節點的後節點進行串連//讓要刪除節點的前一個節點,指向被刪除節點的後一個節點,也就是指向要刪除節點的後後一個節點temp.setNext(temp.getNext().getNext());//把要刪除的節點隔過去進行串連,也就是實現了刪除節點的操作//刪除之後鏈表的長度變短了1位count--;}//以給出的index 尋找節點public Node findNode(int index){if(index<0||index>count-1){System.out.println("鏈表索引越界");}Node temp = head;for(int i=0;i<index-1;i++){temp=temp.getNext();//找到之後擷取index在鏈表中的位置,表示鏈表中第index個節點的值是temp.getData;}return temp;//根據需要可返回找到的資料對象,也可不返回,此處建議返回,這樣可以把鏈表封裝起來}//以對象尋找節點public Node findNode(NodeData data){Node temp = head;while(temp!=null){if(temp.equals(data)){return temp;}temp.setNext(temp.getNext());}return null;}//修改public void updateNode(NodeData data){Node temp = findNode(data);if(temp!=null){temp.setData(data);}}//列印public void print(){Node temp=head;while(temp!=null){temp.print();//temp.print(temp.getData().toString());temp=temp.getNext();}}}
雙鏈表(雙向鏈表):雙鏈表和單鏈表相比,多了一個指向尾指標(tail),雙鏈表的每個結點都有一個頭指標head和尾指標tail,雙鏈表相比單鏈表更容易操作,雙鏈表結點的首結點的head指向為null,tail指向下一個節點的tail;尾結點的head指向前一個結點的head,tail 指向為null,是雙向的關係;
雙鏈表的操作:
package soft1;public class LinkList {Node head;Node tail;int count;public LinkList(Node head,Node tail,int count){this.head=null;this.tail=null;this.count=0;}public LinkList(){}//尾插法添加節點public void addHeadNode(NodeData data){Node node = new Node(data,null,null);if(head==null&&tail==null){head=node;head.setFront(null);tail=node;tail.setNext(null);}else{head.setFront(node);node.setNext(head);head=node;head.setFront(null);}count++;}//頭插法添加節點public void addTailNode(NodeData data){Node node = new Node(data,null,null);if(head==null&&tail==null){head=node;head.setFront(null);tail=node;tail.setNext(null);}else{tail.setNext(node);node.setFront(tail);tail=node;tail.setNext(null);}count++;}//尋找節點public Node findNode(NodeData data){Node temp=head;if(head!=null){while(temp!=null){if(temp.data.compare(data)){return temp;}temp=temp.getNext();}}return null;}//刪除節點public void delNode(NodeData data){Node temp=findNode(data);if(temp!=null){if(temp.getFront()==null){head=temp.getNext();head.setFront(null);}else if(temp.getNext()==null){tail=tail.getFront();tail.setNext(null);}else{temp.getFront().setNext(temp.getNext());temp.getNext().setFront(temp.getFront());}count--;}}//修改更新public void updNode(NodeData data){Node temp=findNode(data);if(temp!=null){temp.setNodeData(data);}}//列印鏈表public void printNode(){Node temp = head;while(temp!=null){temp.print();temp=temp.getNext();}}}
需要把自己寫過的代碼總結之後都放在網上,不過就是有點慢,急不得啊 哈哈