資料結構-線性表-連結串列的程式碼詳解
繼上篇文章對順序表的介紹,這篇文章介紹連結串列,作為資料結構中最重要的一大模組,連結串列也是以後常用的
單鏈表是其中的核心,理解了單鏈表,其實連結串列的知識你也就掌握了。
程式碼附在最後!!!! 思路在程式註釋。詳解
一。
1.程式碼部分 一包 三類 節點類,連結串列類,測試類 在學習過程中可以對著左側行序號更改程式碼
2.節點類
3.連結串列類
4.測試類
5.執行結果:
二。程式碼附上
Node.java
package LinkList; /* * 定義節點類,後續合成連結串列或者對連結串列進行操作 * */ public class Node { //節點儲存的變數 public int data; //指向下一個節點 public Node next = null; public Node(int data) { this.data = data; } }
LinkedList.java
package LinkList;
/* * 定義連結串列模板,將連結串列物件的增刪改查等功能補充完整 * 有時我們會在連結串列的頭節點之前加一個固定的頭節點表示開始,其可以用來儲存附加資訊等 * 這次的demo我們沒有使用這種頭節點,所以實際實現連結串列以後,頭節點就是真正的資料塊節點 * */ public class LinkedList { //定義連結串列的頭節點,因為連結串列剛建立是空,所以定義頭節點為null Node head = null; //給連結串列新增節點,實質是尋找末尾節點,並將其指向新節點,使新節點的指向為null public void AddNode(int data) { Node newNode = new Node(data); //尋找並定義末尾節點 //若head開始便是空的,則證明是空連結串列,直接讓head指向新插入節點,程式結束 if(head==null) { head = newNode; return; } //定義末尾節點temp Node temp = head; //迴圈使temp從頭走到null,此時temp指向null的節點為末尾節點 while(temp.next!=null) { temp = temp.next; } //將temp指向新插入的節點,如此便實現了連結串列節點的插入 temp.next=newNode; } //刪除連結串列節點,實質是將要刪除節點的前節點的next指向刪除節點的後節點,從而跳過該節點 public void DeleteNode(int index) { //判斷index是否合法,由此便需要求連結串列的長度length if(index<1||index>Length()) { try { throw new Exception("此位置不合法,無節點可刪除"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } //如果刪除位置在頭節點,故直接讓head指向後節點便跳過,不需要執行太多邏輯 if(index == 1) { head = head.next; } //如果刪除位置不在頭節點,則執行邏輯 //定義兩個節點,這兩個節點遍歷往後走,當後節點到達所要刪除的節點的位置時 //將前節點的next指向後節點的next,從而在連結串列結構中跳過index處的節點,實現刪除 Node preNode = head; Node bacNode = preNode.next; //定義i計數是否到達index-1處,因為當i到達index-1的前一處時 //preNode到達了index-1,bacNode剛好到達index處,所以使preNode.next = bacNode.next剛好跳過index int i = 1; while(i<index-1) { preNode = preNode.next; bacNode = bacNode.next; i++; } //到達index處,進行跳過該節點 preNode.next = bacNode.next; } //列印list值 public void FindAll() { Node newNode = head; //此處是節點是否存在而不是節點指向是否為空 while(newNode!=null) { System.out.println(newNode.data+" "); newNode = newNode.next; } } //查詢正數某處節點的值 public void FindOne(int index) { //判斷index是否合法 if(index<1||index>Length()) { return; } Node newNode = head; for(int i=0;i<index-1;i++) { newNode = newNode.next; } System.out.println("正數所求的值為"+newNode.data); } //查詢倒數某處節點的值 public void FindBackOne(int index) { //判斷index是否合法 if(index<1||index>Length()) { return; } //定義前後兩個節點,相距距離為index,當後節點指向為null的時候,前節點的data為所求的值 Node preNode = head; Node backNode = preNode; for(int i=1;i<index;i++) { backNode = backNode.next; } while(backNode.next!=null) { preNode = preNode.next; backNode = backNode.next; } System.out.println("倒數所求值為"+preNode.data); } //求連結串列的長度 public int Length() { int length = 0; //節點從頭遍歷,直到指向null //故定義一個節點使其為頭節點 Node newNode = head; //注意是節點不為空,而不是指向不為空 while(newNode!=null) { length++; newNode = newNode.next; } return length; } } Test.java
package LinkList;
public class Test {
public static void main(String[] args) { // TODO Auto-generated method stub //建立連結串列 LinkedList la = new LinkedList(); //連結串列節點插入 la.AddNode(11); la.AddNode(22); la.AddNode(33); la.AddNode(44); la.AddNode(55); //連結串列刪除節點 la.DeleteNode(2); //正向查詢某一結點 la.FindOne(4); //反向查詢某一結點 la.FindBackOne(4); //列印全部節點data la.FindAll(); }
}