Linked List 單向鏈表

Linked List

鏈表的理解

#

小結

  1. 鏈表是以節點的方式來儲存的
  2. 每個節點包括 data域:存放數據,next域:指向下一個節點
  3. 如圖:發現鏈表的各個節點不一定是連續儲存的
  4. 鏈表分爲帶頭節點的鏈表和沒有頭結點的鏈表,這樣根據實際需求而定。

單向鏈表

添加

添加到最後
  1. 找到鏈表的最後一個節點[通過節點的next == null]
  2. 將最後這個節點的next指向新的節點
//初始化一個頭結點,裏面什麼都不放
    HeroNode head = new HeroNode(0, "", "");

    /**
     * 向鏈表中添加一個節點
     * 不考慮編號順序
     */
    public void add(HeroNode heroNode) {
        //因爲頭節點是不能動的,使用中間變量temp來保存頭節點
        HeroNode temp = head;
        //遍歷節點,找到最後一個節點【通過最後一個節點next指向爲 null】
        while (true) {
            if (temp.next == null) {
                //找到最後一個節點
                break;
            }
            //沒有找到就將temp後移一個
            temp = temp.next;
        }
        // 當循環退出的時候temp就指向節點的最後一個
        temp.next = heroNode;
    }
考慮編號順序添加
  1. 找到新添加節點的位置,通過輔助變量(temp)[遍歷找到新節點的位置]

  2. 新的節點.next = temp.next

  3. temp.next = 新的節點

    image.png

/**
     * 考慮排序編號添加
     *
     * @param heroNode
     */
    public void addByOrder(HeroNode heroNode) {
        //因爲頭節點是不能動的,使用輔助變量temp尋找位置
        HeroNode temp = head;

        //用來代表當前添加的節點的編號是否存在,默認false不存在
        boolean flag = false;

        while (true) {
            if (temp.next == null) {
                //當前temp爲鏈表最後一個
                break;
            }
            if (temp.next.no > heroNode.no) {
                //找到需要添加的位置,就在temp後面添加
                break;
            } else if (temp.next.no == heroNode.no) {
                //需要添加的節點已經存在
                flag = true;
                break;
            }
            //三個條件不成立  temp後移
            temp = temp.next;
        }
        if (flag) {
            //不能添加,編號存在
            System.out.printf("當前添加的英雄編號 %d 已經存在, 不能添加\n", heroNode.no);
        } else {
            //在temp後面進行添加
            heroNode.next = temp.next;
            temp.next = heroNode;
        }
    }

修改

  • 使用temp.no == newHeroNode.no判斷是否爲需要修改的節點
/**
     * 更新節點
     *
     * @param newHeroNode
     */
    public void update(HeroNode newHeroNode) {
        if (head.next == null) {
            System.out.println("當前鏈表爲空");
            return;
        }
        //因爲頭節點是不能動的,使用中間變量temp來保存頭節點
        HeroNode temp = head;
        boolean flag = false;   //用來表示鏈表中是否存在需要修改的節點
        while (true) {
            if (temp.next == null) {
                break;
            }
            if (temp.no == newHeroNode.no) {
                flag = true;
                break;
            }
            temp = temp.next;   //temp後移
        }
        if (flag) {
            temp.name = newHeroNode.name;
            temp.nickName = newHeroNode.nickName;
        } else {
            System.out.printf("沒有找到編號爲:%d 節點", newHeroNode.no);
        }
    }

刪除

  1. 找到需要刪除的節點的前一個節點temp
  2. temp.next = temp.next.next
  3. 被刪除的節點 將不會有其他引用指向,會被垃圾回收機制回收
 /**
     * 刪除節點
     *
     * @param no
     */
    public void del(int no) {
        if (head.next == null) {
            System.out.println("當前鏈表爲空");
            return;
        }
        //因爲頭節點是不能動的,使用中間變量temp來保存頭節點
        HeroNode temp = head;

        boolean flag = false;   //表示是否找到需要刪除的節點

        while (true) {
            if (temp.next == null) {
                break;
            }
            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);
        }

    }

dataStructures: gitee

dataStructures: github

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章