單連結串列基本介紹以及按照順序插入節點

一粒孤舟~發表於2020-10-24

連結串列介紹:

連結串列是有序的列表,但是在記憶體中他是這樣儲存的:
在這裡插入圖片描述
由上圖可知:

  1.     連結串列是以節點儲存的,是鏈式儲存。
  2.     節點中包含data域,next域,data域存資料,next域儲存下一個節點。
  3.     連結串列的各個節點不一定是連續儲存的
  4.     連結串列分為帶頭節點的連結串列不帶頭節點的連結串列

單連結串列的邏輯示意圖如下:
在這裡插入圖片描述
實際上,邏輯上看似按順序a1-a2-a3…但不一定!!

單連結串列的應用例項:

使用帶head頭節點的單向連結串列實現 水滸排行榜管理完成對英雄人物的增刪改查操作!
  1. 第一種方法在新增英雄時,直接新增到連結串列的尾部
    在這裡插入圖片描述
    思路分析:
    新增(建立)
    1. 由於head頭結點不能動,所以需要藉助輔助變數實現。 頭節點只代表單連結串列的頭
    2. 直接將節點新增到連結串列尾部。需要通過遍歷找到連結串列尾部,再將節點新增進去
    遍歷連結串列:
    通過1個輔助變數遍歷,幫助遍歷整個連結串列
    程式碼實現:
//建立單連結串列
class singleLinkedList {
    //首先建立一個頭結點,作用只是代表單連結串列的頭
    private HeroNode head = new HeroNode(0, "", "");

    // 新增節點
    public void add(HeroNode heroNode) {
        //因為我們的頭結點不能動,所以需要建立一個輔助變數temp
        HeroNode temp = head;
        //迴圈,判斷節點是否是最後一個節點
        while (true) {
            if (temp.next == null) { //表名當前是最後一個節點
                break;
            }
            //表明當前不是最後一個節點,將temp 後移
            temp = temp.next;
        }
        //表明是最後節點,將新的節點賦值給最後這個節點的next
        temp.next = heroNode;
    }

    //顯示連結串列【遍歷】
    public void list() {
        if (head.next == null) {
            System.out.println("連結串列為空!~");
            return;
        }
        //上面已經判斷過連結串列是否為空,所以下面是連結串列不為空的時候
        // 遍歷連結串列: 因為頭結點不能動,所以需要一個輔助變數。
        HeroNode temp = head.next;
        while (true) {
            //##  我寫錯的程式碼,導致的結果 最後一個node不顯示!
            //if (##temp.next## == null) {//遍歷到最後一個節點
            if (temp == null){
                break; //跳出迴圈
            }
            //輸出節點資訊
            System.out.println(temp);
            //還沒有遍歷到最後的節點,所以要後移temp
            temp = temp.next;
        }
    }
}

class HeroNode { //節點
    public int no; //編號
    public String name;
    public String nickname;
    public HeroNode next; //next域, 指向下一個節點


    public HeroNode(int no, String name, String nickname) {
        this.no = no;
        this.name = name;
        this.nickname = nickname;
    }

    //顯示節點
    @Override
    public String toString() {
        return "HeroNode{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", nickname='" + nickname + '\'' +
                '}';
    }
}

測試程式碼:

public class SingleLinkedListDemo {
    public static void main(String[] args) {
        // 建立節點
        HeroNode hero1 = new HeroNode(1, "宋江", "及時雨");
        HeroNode hero2 = new HeroNode(2, "盧俊義", "玉麒麟");
        HeroNode hero3 = new HeroNode(3, "豹子頭", "林沖");
        HeroNode hero4 = new HeroNode(4, "花和尚", "魯智深");

        //建立連結串列:
        singleLinkedList singleLinkedList = new singleLinkedList();
        //新增節點到連結串列中
        singleLinkedList.add(hero1);
        singleLinkedList.add(hero2);
        singleLinkedList.add(hero3);
        singleLinkedList.add(hero4);
        //遍歷 輸出節點
        singleLinkedList.list();
    }
}
  1. 第二種方法,按照排名新增英雄插入到指定位置(如果有這個排名,則新增失敗,並給出提示資訊)
    思路分析示意圖:
    在這裡插入圖片描述
    需要按照編號的順序新增:
    1.首先需要先找到新新增節點的位置,需要藉助輔助變數來搞定
    1.1 遍歷連結串列,
    1.1.1判斷連結串列是否為空
    1.1.2 判斷temp.next.no > 新節點.no,找到新節點的位置
    1.1.3 判斷編號是否已存在
    2.新節點.next = temp.next
    3.temp.next = 新節點

程式碼實現:

 public void addByOrder(HeroNode heroNode){
        //頭結點不能動,所以需要藉助輔助變數來完成
        HeroNode temp = head;
        boolean flag = false;//flag表示編號是否存在,預設false不存在。
        //遍歷連結串列
        while (true) { //
            if (temp.next == null){ //表示連結串列為空,直接退出迴圈
                break;//退出迴圈
            }
            if (temp.next.no > heroNode.no){//找到插入的位置,在temp後面,
                break;//退出迴圈
            }else if (temp.next.no == heroNode.no){//表示編號已存在,將flag置為true
                flag = true;
                break;  //退出迴圈
            }
            //否則,temp後移,繼續遍歷當前連結串列
            temp = temp.next;
        }

        //根據flag判斷是否可以新增節點
        if (flag){//編號已經存在,不可以新增節點,給出提示資訊
            System.out.printf("%d編號已經存在,不能新增節點",heroNode.no);
        }else{ //編號不存在,可以新增節點
            heroNode.next = temp.next;
            temp.next = heroNode;
        }
    }

遍歷連結串列的方法和方法一相同,這邊就不給出了,可以參考上面。

這時,我們再測試一下:

public class SingleLinkedListDemo {
    public static void main(String[] args) {
        // 建立節點
        HeroNode hero1 = new HeroNode(1, "宋江", "及時雨");
        HeroNode hero2 = new HeroNode(2, "盧俊義", "玉麒麟");
        HeroNode hero3 = new HeroNode(3, "豹子頭", "林沖");
        HeroNode hero4 = new HeroNode(4, "花和尚", "魯智深");

        //建立連結串列:
        singleLinkedList singleLinkedList = new singleLinkedList();
        //新增節點到連結串列中
//        singleLinkedList.add(hero1);
//        singleLinkedList.add(hero2);
//        singleLinkedList.add(hero3);
//        singleLinkedList.add(hero4);

        //按照排名順序插入節點
        singleLinkedList.addByOrder(hero2);
        singleLinkedList.addByOrder(hero1);
        singleLinkedList.addByOrder(hero4);
        singleLinkedList.addByOrder(hero3);
        //遍歷 輸出節點
        singleLinkedList.list();
    }
}

相關文章