數據結構與算法——Java實現單向鏈表的增刪改查

數據結構與算法——Java實現單向鏈表的增刪改查

單向鏈表增刪改查,通過no進行插入排序

//定義SingleLinkedList管理單鏈表
class SingleLinkedList {
    //先初始化一個頭節點,頭節點不要隨意修改
    private HeroNode head = new HeroNode(0, "", "");


    //添加節點到單向鏈表
    //不考慮順序編號,先找到最後一個節點,最後節點的next指向新節點即可
    public void add(HeroNode heroNode) {
        //1.創建一個temp節點輔助遍歷
        HeroNode temp = head;

        //2.遍歷鏈表
        while (true) {
            //找到鏈表的最後節點
            if (temp.next == null) {
                break;
            }
            //如果沒有找到,繼續後移
            temp = temp.next;
        }
        //當退出while循環時,temp指向最後的節點
        temp.next = heroNode;
    }

    //第二種添加的方式,安裝順序添加
    public void addByOrder(HeroNode heroNode) {

        //因爲頭節點不能動,仍然通過輔助節點進行遍歷
        HeroNode temp = head;
        boolean 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;//說明變化存在
                break;
            }
            temp = temp.next;  //後移,遍歷當前鏈表
        }

        //通過flag的值進行判斷是否可以添加
        if (flag) {
            System.out.printf("準備插入的%d已經存在了,不能重複添加\n", heroNode.no);
        } else {
            heroNode.next = temp.next;
            temp.next = heroNode;
        }

    }


    //遍歷顯示鏈表
    public void list() {
        //判斷鏈表是否爲空
        if (head.next == null) {
            System.out.println("鏈表爲空");
            return;
        }

        //因爲頭節點不能移動,因此我們需要一個輔助變量來遍歷
        HeroNode temp = head.next;
        while (true) {
            //判斷是否到鏈表最後
            if (temp == null) {
                break;
            }
            //輸出節點的信息
            System.out.println(temp);
            //將temp後移
            temp = temp.next;
        }

    }

    //修改節點信息,根據no編號來修改
    public void update(HeroNode newheroNode) {

        //判斷是否空
        if (head.next == null) {
            System.out.println("鏈表爲空");
            return;
        }
        //找到需要修改的節點
        HeroNode temp = head.next;
        boolean flag = false;
        while (true){
            if (temp==null){
                break;   //到鏈表最後
            }
            if (temp.no == newheroNode.no){
                flag=true;  //找到要修改的節點
                break;
            }
            temp = temp.next;
        }
        if (flag){
            temp.name = newheroNode.name;
            temp.nickname = newheroNode.nickname;
        }else{
            System.out.printf("沒有找到編號爲%d的節點,不能操作\n",newheroNode.no);
        }
    }

    //刪除節點
    //head不能動,需要一個temp節點輔助遍歷
    //用temp與需要刪除的節點比較
    public void del(int no){
        HeroNode temp = head;
        boolean flag = false;
        while (true){
            if (temp.next == null){
                System.out.println("沒有找到待刪除的節點,不能操作");
                return;
            }
            if (temp.next.no == no){
                flag = true;
                break;
            }

            temp = temp.next;
        }

        if (flag){ //找到節點
            temp.next = temp.next.next;
        }else{
            System.out.printf("要刪除的%d節點不存在\n",no);
        }


    }

}


//帶頭節點的單向鏈表
class HeroNode {
    public int no;
    public String name;
    public String nickname;
    public HeroNode next;

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

    //爲了顯示方便,重寫toString方法


    @Override
    public String toString() {
        return "HeroNode{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", nickname='" + nickname + '\'' +
                '}';
    }
}
發佈了35 篇原創文章 · 獲贊 13 · 訪問量 8525
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章