链表

简介: 链表

15616626-af6b5cda7197b6c6.png


结构示意图.png


①链表示意结点的方式来存储,是链式存储;


②每个结点包含data域,next域指向下一个结点;


③如图,链表的每个结点不一定是连续存储;


④链表分带头结点和没有头结点的链表,根据实际需求来确定


head节头(头结点):



①不放具体的数据;

②作用就是表示单链表的表头


代码实现如下:


package DataStructures;
/*
• 单链表 (按存储顺序进行存储)
*/
public class SingleLinkedListDemo {
public static void main(String[] args) {
HeroNode hero1 = new HeroNode(1, "宋江", "及时雨");
HeroNode hero2 = new HeroNode(2, "卢俊义", "玉麒麟");
HeroNode hero3 = new HeroNode(3, "无用", "智多星");
SingleLinkedList singlelinkedlist = new SingleLinkedList();
singlelinkedlist.addOrderBy(hero1);
singlelinkedlist.addOrderBy(hero3);
singlelinkedlist.addOrderBy(hero2);
singlelinkedlist.findNode(3);
}
}



class SingleLinkedList {
// 定义一个头结点,头结点的作用,定位这个链表得初始位置
private HeroNode head = new HeroNode(0, "", "");
// 添加结点到链表当中
// 当不考虑编号顺序时
// 1.找到当前链表得最后结点
// 2.将最后这个结点得next指向新的结点
public void addNode(HeroNode heronode) {
    // 因为head结点不能动,我们需要一个辅助遍历temp
    HeroNode temp = head;
    // 遍历链表,找到最后
    while (true) {
        // 找到最后链表
        if (temp.next == null) {
            break;
        } else {
            // 如果没有找到最后,就temp后移
            temp = temp.next;
        }
    }
    // 当退出循环后,temp就遍历到了链表得最后
    temp.next = heronode;
}
public void listNode() {
    // 判断链表是否为空
    if (head.next == null) {
        System.out.println("链表为空");
        System.out.println("aaaaa");
        return;
    }
    // 同理 因为头结点不能动,我们需要一个辅助变量来遍历
    HeroNode temp = head.next;
    while (true) {
        // 判断是否到链表最后
        if (temp == null) {
            break;
        }
        // 输出结点信息
        System.out.println(temp);
        // 将temp后移,一定将temp后移
        temp = temp.next;
    }
}
// 删除一个单链表结点
public void deleteNode(int no) {
    HeroNode temp = head;
    boolean flag = false;
    while (true) {
        if (temp == 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);
    }
}
// 对单链表里面得结点进行修改
public void update(HeroNode newhero) {
    HeroNode temp = head;
    boolean flag = false;
    while (true) {
        if (temp == null) {
            break;// 已经遍历完链表
        }
        if (temp.no == newhero.no) {
            // 找到
            flag = true;
            break;
        }
        temp = temp.next;// 将结点后移
    }
    // 根据flag判断是否找到要修改得结点
    if (flag) {
        temp.name = newhero.name;
        temp.nickname = newhero.nickname;
    } else {
        System.out.printf("没有找到编号%d的结点,不能进行修改\n", newhero.no);
    }
}
// 查找结点
public void findNode(int no) {
    HeroNode temp = head;
    boolean flag = false;
    while (true) {
        if (temp == null) {
            break;
        }
        if (temp.no == no) {
            flag = true;
            break;
        }
        temp = temp.next;
    }
    if (flag) {
        System.out.println(temp);
    } else {
        System.out.printf("所查%d结点不存在\n", no);
    }
}
// 按照序号编号进行排列
public void addOrderBy(HeroNode hero) {
    // 因为头结点不能动,因此我们通过一个辅助变量来帮助我们找到添加得位置
    // 因为是单链表,我们找的temp是位于添加结点得前一个位置,否则插入不了
    HeroNode temp = head;// 定义一个便遍历得游标
    boolean flag = false;// flag标志添加得编号是否存在,默认为false
    while (true) {
        if (temp.next == null) {// 说明已经是链表得最后了
            break;
        }
        if (temp.next.no > hero.no) {// 位置找到,就在temp后面插入
            break;
        } else if (temp.next.no == hero.no) {
            flag = true;// 说明编号已经找到
            break;
        }
        temp = temp.next;// 进行后移,遍历当前链表
    }
    if (flag) {
        System.out.printf("准备插入得编号%已经存在了,不能加入\n", hero.no);
    } else {
        // 插入到链表中,temp的后面
        hero.next = temp.next;// 将当前得下一个结点赋值给传入得结点next
        temp.next = hero;// 将传入得结点赋值给找到结点得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;
    this.next = next;
}
@Override
public String toString() {
    return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + "]";
}
}




相关文章
|
5月前
|
存储 Python
什么是链表
什么是链表
49 0
|
5月前
链表之有头链表
链表之有头链表
|
11月前
|
存储
07 链表
07 链表
31 0
|
存储 算法 Java
【JavaOj】链表十连问
【JavaOj】链表十连问
100 0
|
存储 算法 Java
一文带你深入了解链表(C)
📖作者介绍:22级树莓人(计算机专业),热爱编程<目前在c阶段>——目标C++、Windows,MySQL,Qt,数据结构与算法,Linux,多线程,会持续分享学习成果和小项目的 📖作者主页:热爱编程的小K 📖专栏链接:C 🎉欢迎各位→点赞👏 + 收藏💞 + 留言🔔​ 💬总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🐾 ———————————————— 版权声明:本文为CSDN博主「热爱编程的小K」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_7215744
|
存储 索引
变幻莫测的链表
双链表 单链表中的指针域只能指向节点的下一个节点。 双链表:每一个节点有两个指针域,一个指向下一个节点,一个指向上一个节点。 双链表 既可以向前查询也可以向后查询。
71 0
|
存储 API
链表——初识链表
链表是一种物理存储单元上非连续、非顺序的存储结构,其物理结构不能只管的表示数据元素的逻辑顺序,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
107 0
链表——初识链表
|
算法
链表必知必会
链表必知必会
70 0
链表必知必会