單連結串列實現原理以及具體程式碼(java)

weixin_43143304發表於2021-01-04

單連結串列


一、什麼是單連結串列?

單連結串列是一種鏈式存取的資料結構,以節點的方式鏈式儲存資料,每個節點包含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 + '\'' +
                '}';
    }
}

相關文章