链表介绍:
链表可以有头节点、也可以没有头节点,按照实际需要来定义
链表是一个有序的列表,有头节点的链表在内存的分布是这样的:
- 链表是以节点的方式来存储的
- 每个节点包含data域来存数据、next域则是指向下一个节点的
- 链表的各个节点不一定是连续存放的
单链表的逻辑结构:
逻辑分析的时候可以如此分析,若下一个为null则此链表结束
一个实例:水浒传英雄的录入(没有排序):
public class SingleLink {
public static void main(String[] args) {
HeroNode heroNode1 = new HeroNode(0,"宋江","及时雨");
HeroNode heroNode2 = new HeroNode(1,"卢俊义","玉麒麟");
HeroNode heroNode3 = new HeroNode(2,"吴用","智多星");
HeroNode heroNode4 = new HeroNode(3,"林冲","豹子头");
LiskListHeroNode liskListHeroNode = new LiskListHeroNode();
liskListHeroNode.add(heroNode1);
liskListHeroNode.add(heroNode2);
liskListHeroNode.add(heroNode3);
liskListHeroNode.add(heroNode4);
liskListHeroNode.showNode();
}
}
//管理HeroNode的链表
class LiskListHeroNode{
//初始化一个头节点,不动不存放数据
private HeroNode hero = new HeroNode(0,"","");
//添加单向链表:直接在链表的最后添加不考虑排序的问题
public void add(HeroNode heroNode){
//定义一个临时的节点,代替头节点进行遍历
HeroNode temp = hero;
while (true){
//判断下一个节点是否为空
if (temp.next == null){
break;
}else {
//如果下一个节点不为空则表明这不是最后一个节点
temp = temp.next;
}
}
//while结束之后,那么这个temp就是最后这个链表的指向,直接将其指向新节点即可
temp.next = heroNode;
}
//显示链表
public void showNode(){
//如果下一个节点为空就直接结束否则就将下一个节点赋值给临时变量
if (hero.next == null){
System.out.println("链表为空");
return;
}
HeroNode temp = hero.next;
//这里表示头节点的下一个并不为空,那么开始遍历
while (true){
//链表结束
if (temp == null){
return;
}else {
System.out.println(temp);
temp = temp.next;
}
}
}
}
//单个英雄的信息
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() {
//若将next也重写那么会直接从此节点一直打到最后那个为null的节点
return "HeroNode{" + "no=" + no + ", name='" + name + '\'' + ", nickName='" + nickName + '\''+'}';
}
}