介绍
1.链表是有序列表;
2.链表是以节点的方式来存储的;
3.每个节点包含data域, next域(指向下一个节点);
4.链表分带头节点的链表和没有头节点的链表,根据实际需求来确定;
5.如图(实际图)我们发现:链表的各个节点不一定是连续存放的;
看一个逻辑图:
单向链表
实例应用
使用带head节点的单向链表实现-----水浒英雄排行榜管理
代码实现
public class SingleLinkedListDemo {
public static void main(String[] args) {
//进行测试
HeroNode hero1 = new HeroNode(1,"宋江","及时雨");
HeroNode hero2 = new HeroNode(2,"卢俊义","玉麒麟");
HeroNode hero3 = new HeroNode(3,"吴用","智多星");
HeroNode hero4 = new HeroNode(4,"林冲","豹子头");
SingleLinkedList singleLinkedList = new SingleLinkedList();
//加入英雄
singleLinkedList.addHero(hero1);
singleLinkedList.addHero(hero2);
singleLinkedList.addHero(hero3);
singleLinkedList.addHero(hero4);
//显示一把
singleLinkedList.list();
}
}
//定义SingleLinkedList管理我们的英雄
class SingleLinkedList{
//初始化一个头节点,不存放具体数据
private HeroNode head = new HeroNode(0,"","");
//不考虑顺序,找到链表的最后节点,将最后的next指向新的节点
public void addHero(HeroNode heroNode){
HeroNode temp = head;
//遍历链表找到最后一个
while(true){
if(temp.next == null){
break;
}
temp = temp.next;
}
temp.next = heroNode;
}
//显示链表
public void list(){
if(head.next == null){
System.out.println("链表为空");
return;
}
HeroNode tmp = head.next;
while (true){
if(tmp.next == null){
System.out.println(tmp);
break;
}
System.out.println(tmp);
tmp = tmp.next;
}
}
}
class HeroNode{
public int no;
public String name;
public String nickName;
public HeroNode next; //指向下一个节点
//构造器
public HeroNode(int hNo,String hName,String hNickName) {
this.no = hNo;
this.name = hName;
this.nickName = hNickName;
}
//重写toString
@Override
public String toString() {
return "HeroNode{" +
"no=" + no +
", name='" + name + '\'' +
", nickName='" + nickName + '\'' +
'}';
}
}
此时运行程序,发现没问题
但是如果我们把英雄插入顺序改变了,运行结果就会
我们发现顺序是不对的,怎么能让他按照顺序添加呢?
思维图:
插入并排序
改进add()方法,起名为addByOrder()
//添加方法二
public void addByOrder(HeroNode heroNode){
//因为头节点不能动
HeroNode temp = head;
//因为是处于添加到的节点上
boolean flag = false;//添加的编号是否存在
while(true){
if(temp.next == null){
break;
}
if(temp.next.no > heroNode.no){ //说明我的heroNode应该插入到这个temp的后面
break;
}else if (temp.next.no == heroNode.no){
flag = true;
break;
}
temp = temp.next; //后移
}
//判断flag的值
if (flag){
System.out.printf("准备插入的英雄%d已经有了\n",heroNode.no);
}else {
//插入数据
heroNode.next = temp.next;
temp.next = heroNode;
}
}
插入英雄,不按照顺序加入
//加入英雄
singleLinkedList.addByOrder(hero1);
singleLinkedList.addByOrder(hero4);
singleLinkedList.addByOrder(hero2);
singleLinkedList.addByOrder(hero3);
运行代码:
顺序依然正确
至此我们解决了插入排序的问题。