1. 程式人生 > 其它 >單鏈表實現原理以及具體程式碼(java)

單鏈表實現原理以及具體程式碼(java)

技術標籤:資料結構java資料結構

單鏈表

文章目錄


一、什麼是單鏈表?

單鏈表是一種鏈式存取的資料結構,以節點的方式鏈式儲存資料,每個節點包含date域和next域(指向下一個節點),連結串列分為帶頭結點和不帶頭結點。

二、實現原理

在這裡插入圖片描述
單鏈表就是每個節點的next域指向下一個節點。

連結串列是需要自定義實現的,關鍵在於下面兩點:
1.在建立需要單鏈表儲存的物件時,定義一個該物件的屬性next,用於表示下一個節點。(這樣的話,doubleEdgedSword.next就可以表示下一個節點)
在這裡插入圖片描述
2.第二點就是通過連結串列新增資料時,需要定義一個頭結點(DoubleEdgedSword head = new DoubleEdgedSword(0,null,null));

同時因為頭結點不能動,又需要新增一個輔助節點(DoubleEdgedSword item = head),用於在遍歷時指定節點

二、使用步驟

程式碼實現(java):

/**
 * 單向連結串列
 */
public class SinglyLinkedListDemo {
    public static void main(String[] args) {
        //測試
        DoubleEdgedSword sword2 = new DoubleEdgedSword(2, "鯊齒", "魏莊");
        DoubleEdgedSword sword1 =
new DoubleEdgedSword(1, "淵虹", "蓋聶"); DoubleEdgedSword sword11 = new DoubleEdgedSword(11, "巨擘", "勝七"); DoubleEdgedSword sword4 = new DoubleEdgedSword(4, "干將莫邪", "傻胖"); SinglyLinkedList singlyLinkedList = new SinglyLinkedList
(); //新增資料入連結串列(考慮順序:這裡自定義的順序是按照no從小到大) singlyLinkedList.addByOrder(sword2); singlyLinkedList.addByOrder(sword1); singlyLinkedList.addByOrder(sword11); singlyLinkedList.addByOrder(sword4); //遍歷連結串列 singlyLinkedList.getLinked(); //修改連結串列節點 singlyLinkedList.updateLinkedList(new DoubleEdgedSword(14,"巨闕","陳勝")); //修改後再次遍歷連結串列 System.out.println("======================================="); singlyLinkedList.getLinked(); /*//測試刪除連結串列節點 singlyLinkedList.deleteLinkedList(1); singlyLinkedList.deleteLinkedList(2); singlyLinkedList.deleteLinkedList(4); singlyLinkedList.deleteLinkedList(11); // System.out.println("==========================="); singlyLinkedList.getLinked();*/ } } /** * 連結串列操作(增、刪、改、查) */ class SinglyLinkedList{ //首先初始化一個頭結點,不存放任何資料 private DoubleEdgedSword head = new DoubleEdgedSword(0, "", ""); public DoubleEdgedSword getHead(){ return head; } /** * 向連結串列中新增資料的方法(考慮順序:自定義順序:no從小到大) */ public void addByOrder(DoubleEdgedSword doubleEdgedSword){ //同樣需要一個輔助節點 DoubleEdgedSword item = head; Boolean logo = true; //用來做標識,判斷新增的資料是否存在 // while (true){ if (item.next == null){ //節點到達了最後一個節點 break; } if (item.next.no > doubleEdgedSword.no){ //找到了新節點應該存放的位置 break; }else if (item.next.no == doubleEdgedSword.no){ //說明新節點已經在連結串列中存在 logo = false; break; } item = item.next; //迴圈條件 } if (logo == false){ System.out.println("該元素已經存在於連結串列當中"); }else { //將節點插入連結串列 doubleEdgedSword.next = item.next; //新節點的next指向item的next item.next = doubleEdgedSword; //而item的next指向新節點 } } /** * 修改連結串列 * 根據no屬性查詢需要修改的節點 * 傳入新的節點資訊,來修改節點 */ public void updateLinkedList(DoubleEdgedSword newDoubleEdgedSword){ //判斷節點是否為空 if (head.next == null){ System.out.println("節點為空~~~"); return; } //輔助節點 DoubleEdgedSword item = head; Boolean logo = false; //標識是否找到需要修改的節點 // while (true){ if (item.next == null){ break; } if (item.next.no == newDoubleEdgedSword.no){ //找到了需要修改的節點,將標識logo logo = true; break; } item = item.next; } if (logo == false){ System.out.println("連結串列中未找到排行為: " + newDoubleEdgedSword.no + " 的劍"); }else { item.next = newDoubleEdgedSword; } } /** * 刪除連結串列中的節點 */ public void deleteLinkedList(int no){ //判斷連結串列是否為null if (head.next == null){ System.out.println("連結串列為空~~~"); } //輔助節點 DoubleEdgedSword item = head; // while (true){ if (item.next == null){ //以及已經到最後一個節點 System.out.println("連結串列中未找到~~~"); break; } if (item.next.no == no){ //找到了需要刪除的節點 item.next = item.next.next; break; } item = item.next; } } /** * 顯示連結串列(遍歷) */ public void getLinked(){ //判斷連結串列是否為null if (head.next == null){ //頭結點的next為空,所以連結串列為空 System.out.println("連結串列為空~~~"); return; } //同樣因為頭結點不能動,所以我們需要定義一個輔助接點 DoubleEdgedSword temp = head; //遍歷連結串列 while (true){ if (temp.next == null){ //當temp節點到達最後一個節點,即遍歷結束 break; } System.out.println(temp.next); //將temp指向後移 temp = temp.next; } } } //寶劍類(單鏈表形式新增資料) class DoubleEdgedSword{ public int no; //排名 public String name; //劍名 public String sName; //使用者姓名 public DoubleEdgedSword next; //指向下一個節點(下一把寶劍) public DoubleEdgedSword(int no, String name, String sName) { this.no = no; this.name = name; this.sName = sName; } //重寫toString方法不必列印next @Override public String toString() { return "DoubleEdgedSword{" + "no=" + no + ", name='" + name + '\'' + ", sName='" + sName + '\'' + '}'; } }