链表

332 阅读1分钟

1.1 链表介绍

链表是有序的列表,但是它在内存中是存储如下
\begin{array}{c|c|}
    & \text{头指针} \\
    \hline
    \text{head} & 150 \\
    \hline
    \end{array}
\begin{array}{c|c|c|}
    地址 & \text{data域} &
    \text{next域} \\
    \hline
    110 & a_2 & 180 \\
    \hline
    120 & & \\
    \hline
    130 & a_4 & 170 \\
    \hline
    140 & a_6 & null \\
    \hline
    150 & a_1 & 110 \\
    \hline
    160 & & \\
    \hline
    170 & a_5 & 140 \\
    \hline
    180 & a_3 & 130 \\
    \hline
    \end{array}
1) 链表是以节点的方式来存储,是链式存储
2) 每个节点包含data域,next域:指向下一个节点
3) 如图:发现链表的各个节点不一定是连续存储
4) 链表分带头节点的链表和不带头结点的链表,根据实际需求来确定

1.2 单链表的应用实例

使用带head头的单向链表实现 - 水浒英雄排行榜管理完成对英雄人物的增删改查操作
/**
 * 用于管理节点(单向链表)
 */
class SingleLinkedList {
    // 创建链表的头节点
    private HeroNode heroHead = new HeroNode(0, "","");

    /**
     * 在链表中添加元素
     * @param heroNode
     */
    public void add(HeroNode heroNode) {
        HeroNode tmp = heroHead;
        while (true){
            if (tmp.next == null){
                break;
            }
            tmp = tmp.next;
        }
        tmp.next = heroNode;
    }


    /**
     * 按照顺序添加元素
     * @param heroNode
     */
    public void addByOrder(HeroNode heroNode) {
        HeroNode tmp = heroHead;

        // 设置一个标记
        boolean flag = false;
        while (true){
            if (tmp.next == null){
                break;
            }
            if (tmp.next.no == heroNode.no){
                flag = true;
                break;
            }
            if (tmp.next.no > heroNode.no) {
                break;
            }

            tmp = tmp.next;
        }
        if (!flag){
            heroNode.next = tmp.next;
            tmp.next = heroNode;
        }else {
            System.out.println("链表中已经存在这个元素了");
        }
    }

    /**
     * 修改链表中的数据
     * @param heroNode
     */
    public void update(HeroNode heroNode){
        HeroNode tmp = heroHead;
        // 设置标签
        boolean flag = false;
        while (true){
            if (tmp.next == null){
                break;
            }
            if (tmp.next.no == heroNode.no){
                flag = true;
                break;
            }
            tmp = tmp.next;
        }
        if (flag){
            heroNode.next = tmp.next.next;
            tmp.next = heroNode;
        } else {
            System.out.println("链表中并无这个元素");
        }
    }

    /**
     * 删除链表中的数据
     * @param heroNode
     */
    public void del(HeroNode heroNode){
        HeroNode tmp = heroHead;
        boolean flag = false;
        while (true){
            if (tmp.next == null){
                break;
            }
            if (tmp.next.no == heroNode.no)
            {
                flag = true;
                break;
            }
            tmp = tmp.next;
        }
        if (flag){
            tmp.next = tmp.next.next;
        } else {
            System.out.println("链表中并无该元素");
        }
    }


    /**
     * 显示链表中的元素
     */
    public void list(){
        HeroNode tmp = heroHead;
        if (tmp.next == null){
            System.out.println("这是一个空的链表!");
        }
        while (true){
            if (tmp.next == null)
                break;
            System.out.println(tmp.next);
            tmp = tmp.next;
        }
    }

}
/**
 * 节点
 */
class HeroNode {
    /*
     * 节点的属性
     */
    public int no;
    public String name;
    public String nickName;
    public HeroNode next;

    /**
     * 构造函数
     * @param no
     * @param name
     * @param nickName
     */
    public HeroNode(int no, String name, String nickName) {
        this.no = no;
        this.name = name;
        this.nickName = nickName;
    }

    /**
     * 重写toString方法
     * @return
     */
    @Override
    public String toString() {
        return "HeroNode{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", nickName='" + nickName + '\'' +
                '}';
    }
}