1. 程式人生 > >資料結構-線性表-連結串列的程式碼詳解

資料結構-線性表-連結串列的程式碼詳解

繼上篇文章對順序表的介紹,這篇文章介紹連結串列,作為資料結構中最重要的一大模組,連結串列也是以後常用的

單鏈表是其中的核心,理解了單鏈表,其實連結串列的知識你也就掌握了。

程式碼附在最後!!!!    思路在程式註釋。詳解

一。

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();     }

}