public class LinkedList {
public static void main(String[] args) {
// TODO Auto-generated method stub
HeroNode hero1=new HeroNode(1,"钢铁侠","小刚");
HeroNode hero2=new HeroNode(2,"美国队长","小美");
HeroNode hero3=new HeroNode(3,"蜘蛛侠","小蜘");
HeroNode hero4=new HeroNode(4,"绿巨人","小绿");
SingleLinkedList list=new SingleLinkedList();
//测试增的功能
list.add(hero1);
list.add(hero3);
list.addOrder(hero2);
list.addOrder(hero4);
//测试show的功能
list.show();
System.out.println();
//测试search()的功能
System.out.println(list.search(2));
//测试删除功能
list.del(3);
list.show();
//测试update功能
HeroNode hero4_one=new HeroNode(4,"蚁人","小蚂蚁");
list.update(hero4_one);
System.out.println();
list.show();
}
}
//创建单链表的类
class SingleLinkedList {
//成员变量,创建头节点
private HeroNode head=new HeroNode(0,"","");
//添加结点,在链表尾部直接添加
public void add(HeroNode hero) {
HeroNode temp=head;
while(true) {
//当temp.next==null的时候,那么辅助变量已经到了链表尾
if(temp.next==null) {
break;
}
//将辅助变量后移,不然会出现死循环
temp=temp.next;
}
temp.next=hero;
}
//输出单链表里面的全部结点
public void show() {
//引入辅助结点
HeroNode temp=head.next;
if(head.next==null) {
System.out.println("本列表为空");
return ;
}
//遍历所有结点
while(true) {
//当temp==null的时候,结点已经完全遍历
if(temp==null) {
break;
}
//打印结点
System.out.println(temp);
//辅助变量后移,不然会出现死循环
temp=temp.next;
}
}
//本方法以no为关键字,进行插入排数,使他从小到大依次升高
//提示:如果要一直保持有序的进入的单链表的话,请一直使用addOrder()来增加结点
public void addOrder(HeroNode hero) {
HeroNode temp=head;
boolean flag=false;
while(true) {
//结点已经遍历完全
if(temp.next==null) {
break;
}
//让结点按照no从小到大插入,在单链表中遇到第一个no大于参数中hero进行插入
if(temp.next.no>hero.no) {
//找了插入的位置 将flag改变状态
flag=true;
//跳出循环
break;
}
//当单链表中拥有同样的no,则无法进行插入
if(temp.next.no==hero.no) {
System.out.println("已有改结点,不可插入");
return;
}
//辅助遍历的后移
temp=temp.next;
}
if(flag) {
//当在单链表中找到了比插入结点no大的结点时,在其之前插入
hero.next=temp.next;
temp.next=hero;
}else {
//没有找到no比插入结点大的结点,则在队尾插入
temp.next=hero;
}
}
//单链表删除某元素
public void del(int no) {
//判断链表是否为空
if(head.next==null) {
System.out.println("单链表为空");
return;
}
//引入辅助变量,来帮助遍历
HeroNode temp=head;
//引入flag判断删除的元素是否找到了
boolean flag=false;
while(true) {
//说明结点已经完全遍历
if(temp.next==null) {
break;
}
//说明此时找到no对应的结点
if(temp.next.no==no) {
//改变flag的状态
flag=true;
break;
}
//进行辅助变量的后移
temp=temp.next;
}
if(flag) {
//将需要删除的元素的前一个结点和后一个结点直接连接起来
temp.next=temp.next.next;
}else {
System.out.println("删除失败,链表没有此元素此元素");
}
}
//同样以no为关键字进行修改,传进的对象用改变名字或者昵称,因为如果三个都改变的话 相当于add()函数
public void update(HeroNode hero) {
if(head.next==null) {
System.out.println("本单链表为空");
return ;
}
//创建辅助变量
HeroNode temp=head;
//判断带入的hero参数能否找到,能找到为true,不能找到为false
boolean flag=false;
while(true) {
//表明所有结点全部遍历
if(temp.next==null) {
//跳出循环
break;
}
//当两结点的no相等时,说明找到了该元素,可以对他进行跟新
if(temp.next.no==hero.no) {
//flag找到了,将变为true
flag=true;
//跳出循环
break;
}
//辅助遍历需要后移,不然会出现死循环
temp=temp.next;
}
//当flag找到了,则对其进行跟新
if(flag) {
temp.next.name=hero.name;
temp.next.nickname=hero.nickname;
}else {
System.out.println("查找到该元素失败");
}
}
//根据no指,来进行查询
public boolean search(int no) {
//判断单链表是否为空
if(head.next==null) {
System.out.println("链表为空");
return false;
}
//引入辅助变量
HeroNode temp=head.next;
//引入flag判断是否找到了结点,如果是true则是找到了,反则没有找到
boolean flag=false;
while(true) {
//表明结点已经完全遍历
if(temp==null) {
break;
}
//找到了no对应的结点
if(temp.no==no) {
//改变flag的状态
flag=true;
//退出循环
break;
}
//将辅助变量进行后移
temp=temp.next;
}
System.out.println(temp);
return flag;
}
}
class HeroNode{
//data域
protected int no;
protected String name;
protected String nickname;
//next域
HeroNode next;
//HeroNode的构造方法
public HeroNode(int no,String name,String nickname){
this.no=no;
this.name=name;
this.nickname=nickname;
}
//重写HeroNode的toString方法
public String toString() {
return "[编号为:"+no+" 姓名为:"+name+"昵称为:"+nickname+"]";
}
}
Java 实现单链表的增删改查(增填结点包括有序增添以及队尾增添)
猜你喜欢
转载自blog.csdn.net/ShangDiYeGuJi/article/details/104451862
今日推荐
周排行