链表详解和代码演示
单向链表
1.链表的介绍
链表是一种物理存储单元上非连续、非顺序的存储结构
数据元素的逻辑顺序是通过链表中的指针链接次序实现的
链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。
每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域
链表在插入的时间复杂度o(1)
查找一个节点则时间复杂度o(n)
线性表和顺序表相应的时间复杂度插入O(logn)和查询O(1)
链表是有序的列表,但是它在内存是存储如下:
1.1单链表的内存结构图:
1.链表是以节点的方式来存储
2.每个节点包含data域,next域指向下一个节点
3.链表的各个节点不一定是连续存储
4.链表分带头节点和没有头节点的链表,根据实际的需求来确定
1.2单链表(带头节点)逻辑结构示意图
2.单链表的应用实例
2.1题目要求
使用带head头的单项链表实现-水浒英雄排行榜管理
1)完成对英雄人物的增删改查操作
2)第一种方式:在添加英雄时,直接添加到链表的尾部
3)第二种方式:根据排名将英雄插入到指定位置
(如果有这个排名,则添加失败,并给出提示)
2.2思路分析
2.2.1head节点:
1.不存放具体的数据
2.作用就是表示单链表头
2.2.2添加:next指向heroNode (添加到最后)
1.先创建一个head头节点,作用就是单链表的头
2.后面我们每添加一个节点,就直接加入到链表的最后遍历
遍历:
1.通过一个辅助变量
需要按照编号的顺序来添加
2.首先找到新添加的节点的位置,是通过辅助变量(指针)
3.新的节点next=temp.next
4.将temp.next=新的节点
2.2.3按照编号的顺序添加:
1.首先找到新添加的节点的位置,是通过辅助变量(指针)通过遍历来
2.新的节点next=temp.next
3.将temp.next=新的节点
2.2.4单链表的修改
从单链表中删除一个节点的思路
1.我们先找到需要删除的这个节点的前一个节点temp
2.temp.next=temp.next.next
3.被删除的节点,将不会有其他引用指向,会被垃圾回收机制回收
2.3相关代码
public class SingleLinkedListDemo1 {
public static void main(String[] args) {
//测试
HeroNode1 node1 = new HeroNode1(1, "宋江", "及时雨");
HeroNode1 node2 = new HeroNode1(2, "卢俊义", "玉麒麟");
HeroNode1 node3 = new HeroNode1(3, "吴用", "智多星");
HeroNode1 node4 = new HeroNode1(4, "智多星", "豹子头");
HeroNode1 node5 = new HeroNode1(5, "武松", "打虎");
SingleHero singleHero = new SingleHero(