package com.gec.linkedlist;
//模拟单链表的增删改查
//链表实现水浒传的人物添加到链表的末端
public class SingleLinkedListDemo {
public static void main(String[] args) {
// 模拟链表
// 先创建英雄
HeroNode h1 = new HeroNode(1, "宋江");
HeroNode h2 = new HeroNode(2, "吴用");
HeroNode h3 = new HeroNode(3, "鲁智深");
HeroNode h4 = new HeroNode(4, "林冲");
// 创建链表
SingleLinkedList list = new SingleLinkedList();
// 把英雄添加到链表中
// list.add(h1);
// list.add(h2);
// list.add(h3);
// list.add(h4);
// 按顺序吧英雄添加
list.addByOrder(h3);
list.addByOrder(h2);
list.addByOrder(h4);
list.addByOrder(h1);
// 显示整个链表
list.showList();
System.out.println();
//把3号修改成鲁迅
HeroNode hn = new HeroNode(3, "鲁迅");
list.update(hn);
//更新后再显示链表
list.showList();
System.out.println();
//删除
list.delete(4);
System.out.println();
//删除后再显示链表
list.showList();
}
}
//定义一个SingleLinkedList 链表来管理英雄
class SingleLinkedList {
// 初始化一个头结点,头结点不能动
private HeroNode head = new HeroNode(0, "英雄榜");
// 添加节点到单项链表
// 思路:不考虑编号顺序时
// 1 找到当前链表的最后一个节点
// 2 将这个next指向新的一个节点
public void add(HeroNode heroNode) {
// 用一个临时变量表示头结点,然后一个一个向后找直到找到末尾
HeroNode temp = head;
while (true) {
// 如果下个一是空,证明已经找到了结尾,则退出循环
if (temp.next == null) {
break;
}
temp = temp.next;// 将temp后移继续找
}
// 退出循环时,temp已经在链表的最后
// 将temp的next指向新的节点
temp.next = heroNode;
}
// 按照顺序来添加
public void addByOrder(HeroNode heroNode) {
// 思路:循环找到新英雄应该在的位置
// 用临时变量temp表示新英雄应该处在的位置的上一个英雄
// 新英雄的next指向temp的next
// temp的next指向新英雄
HeroNode temp = head;
boolean flag = false;// 定义一个布尔值表示是否存在此英雄,默认是false
while (true) {
// 如果已经没有下一个了,证明新英雄是排在最后的,直接返回
if (temp.next == null) {
break;
}
// 如果英雄编号和已有编号相同,则不能添加
if (temp.next.no == heroNode.no) {
flag = true;
break;
}
// 当找到位置的时候,即temp的下一个位置已经在当前英雄的后面
if (temp.next.no > heroNode.no) {
break;
}
// 让temp继续往后
temp = temp.next;
}
// 如果flag为true,则不能加英雄,退出方法
if (flag) {
System.out.println("英雄" + heroNode.no + "已存在,无法加入");
}
// 添加新英雄
else {
heroNode.next = temp.next;
temp.next = heroNode;
}
}
//删除某个节点
public void delete(int no) {
//定义一个临时变量,从头节点开始
HeroNode temp = head;
//循环链表找该节点,注意通过temp.next.no来找
while(true) {
if(temp.next==null) {
System.out.println("没找到这个节点,删除失败");
return;
}
//如果找到了
if(temp.next.no==no) {
temp.next=temp.next.next;
return;
}
temp=temp.next;//每一次将temp后移
}
}
// 根据no来修改某个英雄的名字
public void update(HeroNode newHeroNode) {
HeroNode temp = head.next;
if(temp.next==null) {
System.out.println("链表是空的,无法修改");
return;
}
//设置一个标记,当找到要修改的英雄编号时设置为true
boolean flag = false;
while(true) {
if(temp == null) {
System.out.println("找到结尾也没找到这个英雄");
break;
}
if(temp.no==newHeroNode.no) {
flag = true;
break;
}
temp = temp.next;
}
if(flag) {
temp.name = newHeroNode.name;
}
}
// 显示整个链表(遍历)
public void showList() {
// 判断链表是否为空
if (head.next == null) {
System.out.println("链表是空的");
return;
}
// 用一个临时变量表示头结点,然后一个一个向后找直到找到末尾
HeroNode temp = head;
while (true) {
if (temp.next == null) {
break;
}
// 输出节点信息
System.out.println(temp.next);
// 如果到末尾,则退出循环
// 将temp后移
temp = temp.next;
}
}
}
//定义一个heronode,每一个heronode对象就是链表中的一个节点
class HeroNode {
int no;
String name;
HeroNode next;// 表示下一个节点
public HeroNode(int no, String name) {
super();
this.no = no;
this.name = name;
}
@Override
public String toString() {
return "HeroNode [no=" + no + ", name=" + name + "]";
}
}
#Java#