資料結構04——單連結串列

浮生一片黑發表於2020-10-07

連結串列基本介紹

在這裡插入圖片描述

單連結串列

在這裡插入圖片描述

應用例項

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

實現程式碼

package list;

import java.beans.beancontext.BeanContext;
import java.time.temporal.Temporal;

/**
 * @program: DataStructures
 * description:
 * @author: Mr.Zhang
 * @create: 2020-28-06_20:28
 **/
public class SingleListDemo {
    public static void main(String[] args) {
        // 測試
        // 1. 首先新增四個節點,普通方法
        SingleList singleList = new SingleList();
        // singleList.addLink(new HeroLink(2, "宋江", "及時雨"));
        // singleList.addLink(new HeroLink(1, "魯智深", "花和尚"));
        // singleList.addLink(new HeroLink(4, "林沖", "豹子頭"));
        // singleList.addLink(new HeroLink(3, "柴進", "小旋風"));
        // 首先新增四個節點,順序插入方法
        singleList.addLinkByOrder(new HeroLink(2, "宋江", "及時雨"));
        singleList.addLinkByOrder(new HeroLink(1, "魯智深", "花和尚"));
        singleList.addLinkByOrder(new HeroLink(4, "林沖", "豹子頭"));
        singleList.addLinkByOrder(new HeroLink(3, "柴進", "小旋風"));
        // singleList.addLinkByOrder(new HeroLink(3, "柴進", "小旋風"));

        // 2. 列印單連結串列
        singleList.showList();

        // 修改元素測驗
        // singleList.updateLink(new HeroLink(2, "宋江", "及時雨-----"));
        // 列印修改後的連結串列
        // singleList.showList();
        // 刪除最後一個元素
        // singleList.delLastLink();
        // singleList.delLastLink();
        // singleList.delLastLink();
        // singleList.delLastLink();
        // singleList.delLastLink();
        // // 再列印
        // singleList.showList();

        // 測試根據id刪除節點
        singleList.delLinkById(12);
        // singleList.delLinkById(1);
        // singleList.delLinkById(3);
        // singleList.delLinkById(4);
        // 列印
        System.out.println("刪除後:");
        singleList.showList();
    }
}

// 單連結串列類
class SingleList {
    // 頭節點
    private HeroLink head = new HeroLink(0, "", "");

    // 新增節點
    public void addLink(HeroLink heroLink) {
        HeroLink temp = head;
        // 遍歷直到找到最後一個節點,然後把最後一個節點的next指向新新增節點
        while (true) {
            // 如果next為空,則說明是temp指向了最後一個節點,則指向新節點
            if (temp.next == null) {
                temp.next = heroLink;
                break;
            }
            // temp後移
            temp = temp.next;
        }
    }

    // 第二種新增節點的方式,通過排名來新增
    public void addLinkByOrder(HeroLink heroLink) {
        // 指標
        HeroLink temp = head;
        boolean flag = false;   // 用於判斷是否有編號重複的元素插入
        while (true) {
            // 1. 判斷是否新增過元素,若沒有,則跳出
            if (temp.next == null) {
                // 沒有新增過元素
                break;
            }
            // 2. 判斷新的元素的id是否等於temp.next的id,若等於,則跳出迴圈,同時置flag為true
            if (heroLink.id == temp.next.id) {
                flag = true;
                break;
            }
            // 3. 判斷新的元素的id是否小於temp.next的id,若小於,則找到位置,跳出迴圈
            if (heroLink.id < temp.next.id) {
                break;
            }
            // 不滿足上述條件,說明沒有找到合適的位置
            // 指標temp後移
            temp = temp.next;
        }
        if (flag) {
            // 說明id重複
            System.out.println("id號重複,不能插入此元素" + heroLink.id);
        }else {
            // 對元素進行插入操作
            // 1. 新元素指向temp.next
            heroLink.next = temp.next;
            // 2. temp指向新元素
            temp.next = heroLink;
        }

    }

    // 修改連結串列的內容,注意編號不能修改
    public void updateLink(HeroLink heroLink) {
        boolean flag = false;   // 用於判斷是否找到了所要修改的元素
        // 判斷是否有元素
        if (head.next == null) {
            // 沒有元素
            return;
        }
        // 獲得指標
        HeroLink temp = head.next;
        while (true) {
            if (temp.next == null) {
                // 遍歷完成,沒有找到元素
                break;
            }
            // 判斷是否找到了所要修改的元素
            if (heroLink.id == temp.next.id) {
                // 找到了,置flag為true,跳出迴圈
                flag = true;
                break;
            }
            // 指標後移
            temp = temp.next;
        }
        if (flag) {
            // 找到元素,進行修改, 只修改暱稱
            temp.nickName = heroLink.nickName;
        }else {
            System.out.println("沒有查到要修改的元素!!!");
        }
    }

    // 顯示列表內容
    public void showList() {
        HeroLink temp = head;
        // 首先判斷單連結串列是否為空
        if (temp.next == null) {
            System.out.println("單連結串列為空");
            return;
        }
        // 遍歷直到找到最後一個節點,然後把最後一個節點的next指向新新增節點
        while (true) {
            // 如果next為空,則說明是temp指向了最後一個節點, 退出迴圈
            if (temp.next == null) {
                break;
            }
            // 否則temp指向下一個節點
            temp = temp.next;
            System.out.println(temp);
        }
    }

    // 刪除單連結串列的最後一個節點
    public void delLastLink() {
        HeroLink temp = head;
        if (temp.next == null) {
            System.out.println("無元素可以刪除,連結串列為空!!!");
            return;
        }
        while (true) {
            if (temp.next.next == null) {
                temp.next = null;
                break;
            }
            temp = temp.next;
        }
    }

    // 刪除指定編號的節點
    public void delLinkById(int id) {
        // 1. 判斷此連結串列是否為空
        if (head.next == null) {
            System.out.println("此連結串列為空。。");
            return;
        }
        // 2. 查詢此編號,根據flag決定狀態,是否查詢到
        boolean flag = false;
        HeroLink temp = head;  // 指向第一個元素
        while (true) {
            // 判斷是否到達最後一個節點
            if (temp.next == null) {
                // 遍歷結束,沒找到
                break;
            }
            // 到這因為肯定有至少一個元素
            if (temp.next.id == id) {
                // 找到了
                flag = true;
                break;
            }

            temp = temp.next;

        }

        // 3. 根據flag決定是否刪除元素
        if (flag) {
            // 找到了元素,進行刪除
            // if (temp.next.next == null) {
            //     // 此種是刪除最後一個元素
            //     temp.next = null;
            // }else
            //     // 否則就是刪除中間元素
            temp.next = temp.next.next;
        }else
            System.out.println("沒找到此元素:" + id);
    }
}

// 英雄類,也就是節點類
class HeroLink {
    public int id;
    public String name;
    public String nickName;
    public HeroLink next;

    // 建構函式,初始化
    public HeroLink(int id, String name, String nickName) {
        this.id = id;
        this.name = name;
        this.nickName = nickName;
    }

    // 列印

    @Override
    public String toString() {
        return "HeroLink{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", nickName='" + nickName + '\'' +
                '}';
    }
}

相關文章