//定义英雄对象,每个对象都是一个节点
class SuperHero{
public int id;
public String name;
public String nickName;
public SuperHero next;
public SuperHero(int sid,String sname,String snickName){
this.id=sid;
this.name=sname;
this.nickName=snickName;
}
@Override
public String toString() {
return "SuperHero{" +
"id=" + id +
", name='" + name + '\'' +
", nickName='" + nickName + '\'' +
'}';
}
}
class SingleLinkedList{
private SuperHero head=new SuperHero(0," "," ");
//在链表的最后一个位置添加节点
public void addHero(SuperHero superHero){
SuperHero temp=head; //定义一个临时虚拟指针指向头节点
//遍历链表 找到最后
while (true){
if (temp.next == null){
break;
}
temp=temp.next; //移动指针 判断是否到达最后一个
}
temp.next=superHero;
}
//在链表指定位置插入一个节点 位置是在temp的后面
public void addByOrder( SuperHero superHero){
SuperHero temp=head;//因为头节点不能动 通过辅助指针帮助找到添加的位置
boolean flag=false;
while (true){
if (temp.next==null){ //判断链表是否为空
break;
}
if (temp.next == superHero){ //判断是否存在一样的数据
flag=true;
break;
} else if (temp.next.id > superHero.id){ //位置找到,就在temp的后面
break;
}
temp=temp.next; //
}
if (flag){
System.out.println("插入的节点已存在 不可插入"+superHero.id);
}else {
//插入节点 在temp 和 temp.next 中间插入
superHero.next=temp.next;
temp.next=superHero;
}
}
//修改节点的信息 编号不能修改
public void update(SuperHero superHero){
SuperHero temp = head.next;
if (temp == null){
System.out.println("链表为空");
}
boolean flag = false;
//找到需要修改的节点
while (true){
if (temp == null){
break;
}
if (temp.id == superHero.id){
//找到
flag = true;
break;
}
temp=temp.next;
}
//根据flag判断是否找到要修改的节点
if (flag){
temp.name = superHero.name;
temp.nickName = superHero.nickName;
}else {
System.out.println("找不到要修改的节点");
}
}
//删除节点的方法
public void deleteById(int id){
SuperHero temp = head;
boolean flag = false;
while (true){
if (temp.next == null){
break;
}
if (id == temp.next.id){
flag = true;
break;
}
temp=temp.next;
}
if (flag){ //找到
temp.next = temp.next.next;
}
}
//遍历节点的方法
public void list(){
SuperHero temp=head;
while (true){
if (temp==null){
return;
}
temp=temp.next; //要在输出语句前执行 因为temp初始指向头节点 为空
System.out.println(temp);
}
}
}
public class SingleLinkedListDemo {
public static void main(String[] args) {
SuperHero her1=new SuperHero(1,"钢铁侠","有钱");
SuperHero her2=new SuperHero(2,"绿巨人","无敌");
SuperHero her3=new SuperHero(3,"奥特曼","迪迦");
SuperHero her4=new SuperHero(4,"蜘蛛侠","蜘蛛");
SuperHero her5=new SuperHero(5,"蜘蛛侠","蜘蛛");
SuperHero her6=new SuperHero(6,"蜘蛛侠","蜘蛛");
SingleLinkedList linkedList=new SingleLinkedList();
linkedList.addByOrder(her1);
linkedList.addByOrder(her3);
linkedList.addByOrder(her2);
linkedList.addByOrder(her6);
linkedList.addByOrder(her4);
linkedList.list();
// System.out.println("修改后的链表");
SuperHero superHero=new SuperHero(4,"wodiao","sdniahj");
linkedList.update(superHero);
linkedList.list();
System.out.println("删除后的");
linkedList.deleteById(5);
linkedList.deleteById(2);
linkedList.list();
}
}
反转单链表的补充方法
//反转链表
public static void reversetList(SuperHero head){
SuperHero temp = head.next;
SuperHero next = null; //临时节点用来保存原链表断开后的节点
SuperHero reverseHead = new SuperHero(0," "," "); //定义一个临时头节点
while (temp!=null){
next =temp.next; //next用来保存节点信息
temp.next = null; //置空进来的节点的next(可省略)
temp.next = reverseHead.next;//让next指向临时头节点的next
reverseHead.next=null; //置空临时头节点的next(可省略)
reverseHead.next = temp;//让临时头节点指向temp
temp=next;//节点后移
}
head.next =reverseHead.next;
}