首頁 > 軟體

java實現單連結串列中的增刪改

2022-05-26 14:07:15

本文範例為大家分享了java實現單連結串列中增刪改的具體程式碼,供大家參考,具體內容如下

什麼是連結串列

連結串列是有序的列表,但是它在記憶體中是儲存如下

小結:

  • 連結串列是以節點的方式來儲存,是鏈式儲存
  • 每個節點包含data 域, next 域:指向下一個節點.
  • 如圖:發現連結串列的各個節點不一定是連續儲存.
  • 連結串列分帶頭節點的連結串列和沒有頭節點的連結串列,根據實際的需求來確定

單連結串列(帶頭結點) 邏輯結構示意圖如下

單連結串列的增刪改應用範例

使用帶head 頭的單向連結串列實現——三國英雄排行榜管理完成對英雄人物的增刪改查操作

1.第一種方法在新增英雄時,直接新增到連結串列的尾部

2.第二種方式在新增英雄時,根據排名將英雄插入到指定位置(如果有這個排名,則新增失敗,並給出提示)

思路:

(1) 先找到該節點,通過遍歷,

(2) temp.name = newHeroNode.name ; temp.nickname= newHeroNode.nickname

程式碼

package com.hsy.linkedlist;

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(hero1);
        singleLinkedList.addByOrder(hero4);
        singleLinkedList.addByOrder(hero3);
        singleLinkedList.addByOrder(hero2);

        //顯示
        singleLinkedList.showList();

        //測試修改
        HeroNode newHeroNode = new HeroNode(3, "滷蛋", "暴躁個錘子");
        singleLinkedList.update(newHeroNode);
        System.out.println("修改後的連結串列情況:");
        singleLinkedList.showList();

        //刪除一個節點
        singleLinkedList.delete(1);
        System.out.println("刪除後的連結串列情況:");
        singleLinkedList.showList();
    }
}

//定義SingleLinkedList來管理我們的英雄
class SingleLinkedList {

    //初始化一個頭節點,不存放資料
    private final HeroNode head = new HeroNode(0, "", "");

    //增
    //新增節點到單向連結串列
    public void add(HeroNode heroNode) {
        //思路:(不考慮編號順序)
        //1.找到當前連結串列的最後節點
        //2.將最後這個節點的next域指向新的節點
        HeroNode temp = head;
        //遍歷連結串列,找到最後的節點
        while (true) {
            if (temp.next == null) {
                break;
            }
            //如果沒有找到最後,將temp後移
            temp = temp.next;
        }
        //必須保證退出while迴圈時,temp指向連結串列的最後,並將最後這個節點的next域指向新的節點
        temp.next = heroNode;
    }

    //第二種方式在新增英雄時,根據排名將英雄插入到指定位置
    // (如果有這個排名,則新增失敗,並給出提示)
    public void addByOrder(HeroNode heroNode) {
        //由於頭節點不能動,因此我們仍然通過一個輔助變數來幫助我們找到新增的位置
        //因為是單連結串列,因此我們找的temp位於新增位置的前一個結點,否則不能插入
        HeroNode temp = head;
        boolean flag = false;//標識新增的編號是否已經存在,預設為false
        while (true) {
            if (temp.next == null) {
                break;
            }
            if (temp.next.no > heroNode.no) {//位置找到
                break;
            } else if (temp.next.no == heroNode.no) {//說明希望新增的編號已經存在
                flag = true;
                break;
            }
            temp = temp.next;
        }
        //判斷flag的值
        if (flag) {//編號已經存在
            System.out.println("準備插入的英雄的編號:" + heroNode.no + "已經存在,不能再加入!");
        } else {
            heroNode.next = temp.next;
            temp.next = heroNode;
        }
    }

    //刪
    //head不能動,我們需要一個temp輔助節點找到待刪除節點的前一個結點
    //我們在比較的時候是temp.next.no和需要刪除的節點的no進行比較
    public void delete(int no) {
        HeroNode temp = head;
        boolean flag = false;
        while (true) {
            if (temp.next == null) {
                break;
            }
            if (temp.next.no == no) {
                //找到了待刪除節點的前一個結點temp
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag) {
            temp.next = temp.next.next;
        } else {
            System.out.println("要刪除的" + no + "節點不存在");
        }
    }

    //改
    //修改節點的資訊,根據編號來修改
    public void update(HeroNode newHeroNode) {
        //判斷連結串列是否為空
        if (head.next == null) {
            System.out.println("連結串列為空!");
        }
        HeroNode temp = head.next;
        boolean flag = false;
        while (true) {
            if (temp == null) {
                break;
            }
            if (temp.no == newHeroNode.no) {
                //找到
                flag = true;
                break;
            }
            temp = temp.next;
        }
        //根據flag判斷是否找到需要修改的值
        if (flag) {//編號已經存在
            temp.name = newHeroNode.name;
            temp.nickname = newHeroNode.nickname;
        } else {//沒有找到
            System.out.println("沒有找到編號為:" + newHeroNode.no + "的節點,不能修改");
        }
    }

    //查
    //顯示遍歷連結串列
    public void showList() {
        //判斷連結串列是否為空
        if (head.next == null) {
            System.out.println("連結串列為空!");
        }
        //由於頭節點不能動,因此我們需要一個輔助變數來遍歷
        HeroNode temp = head.next;
        while (true) {
            //判斷連結串列是否到最後
            if (temp == null) {
                break;
            }
            System.out.println(temp);
            //這時需要將temp後移,否則會陷入死迴圈
            temp = temp.next;
        }
    }
}

//定義一個HeroNode,每個HeroNode物件就是一個節點
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;
    }

    @Override
    public String toString() {
        return "HeroNode{" +
                "no=" + no +
                ", name='" + name + ''' +
                ", nickname='" + nickname + ''' +
                '}';
    }
}

輸出結果

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com