Java 实现单链表的增删改查(增填结点包括有序增添以及队尾增添)

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+"]";
}
}
发布了9 篇原创文章 · 获赞 1 · 访问量 306

猜你喜欢

转载自blog.csdn.net/ShangDiYeGuJi/article/details/104451862