单向链表的增删查改

链表(Linked List)

链表是有序的列表

链表是以节点的方式来存储,是链式存储

每个节点包含data域,next域;指向下一个节点

链表的各个节点不一定是连续存储

链表分带头节点的链表和没有头节点的链表,根据实际需求来确定

单链表的增删改查

package linkedlist;

import javax.swing.plaf.synth.SynthSeparatorUI;

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 sl = new SingleLinkedList();
//		sl.add(hero1);
//		sl.add(hero2);
//		sl.add(hero3);
//		sl.add(hero4);
		sl.addByOrder(hero1);
		sl.addByOrder(hero2);
		sl.addByOrder(hero4);
		sl.addByOrder(hero3);
		sl.list();
		
//		HeroNode hn = new HeroNode(3,"小卢","玉麒麟~~");
//		sl.updata(hn);
		sl.del(3);
		sl.list();
	}
}
//创建SingleLinkedList 管理我们的英雄
class SingleLinkedList{
	//初始化头节点,头结点不要动,不存放具体的数据
	private HeroNode head = new HeroNode(0,"","");
	//添加节点到单向链表
	//当不考虑编号顺序时
	//找到当前链表的最后节点,将最后节点的next指向新的节点
	public void add(HeroNode heroNode) {
		//因为Head节点不能动,因此我们需要一个辅助遍历temp
		HeroNode temp = head;//temp为头指针,临时变量
		//通过遍历链表,找到最后一个节点
		//当循环结束之时,就是找到最后一个节点之日
		while(true) {
			if(temp.next==null) {//第一次调用add时temp.next等于null终止循环
				break;//为null就跳出while循环
			}
			//如果没有找到最后,让temp往后移动,直到找到null为止
			temp=temp.next;//存储传递进来的heroNode节点temp
		}
		//当退出while循环时,temp就指向链表最后
		temp.next=heroNode;//跳出循环后,将传递进来的heroNode节点赋值给临时变量temp
		
	}
	
	//第二种方式在添加英雄时,根据排名奖英雄插入到指定位置
	public void addByOrder(HeroNode heroNode) {
		HeroNode temp = head;
		boolean flag = false;
		while(true) {
			if(temp.next == null){//第二次添加英雄,不为null
				break;
			}
			//假设一开始添加的第一个英雄宋江的编号为1,第二次添加的英雄编号为2,则1>2不成立,则执行temp = temp.next;
			
			if(temp.next.no>heroNode.no) {
				break;
			}else if(temp.next.no == heroNode.no) {
				flag = true;
				break;
			}
			//把1,宋江,及时雨,null 赋值给temp,这个时候再次执行循环,temp.next为null,
			temp = temp.next;
		}
		
		if(flag) {
			System.out.println(heroNode.no+"号已经存在");
		}else {
			heroNode.next = temp.next;//当第一次添加英雄时,把null赋值给节点heroNode的属性next
			temp.next = heroNode;//当第一次添加英雄时,把heroNode节点添加到temp类的属性next中去
							
		}
		
	}
	
	//修改节点的信息,根据no编号来修改
	public void updata(HeroNode newHeroNode) {
		//判断是否为空
		if(head.next == null) {
			System.out.println("链表为空");
			return;
		}
		//找到要修改的节点
		HeroNode temp = head.next;
		boolean flag = false;
		while(true) {
			if(temp == null) {
				break;
			}
			if(temp.no == newHeroNode.no) {
				flag = true;
				break;
			}
			System.out.println(temp.next+"测试");
			temp = temp.next;
		}
		if(flag) {
			temp.name = newHeroNode.name;
			temp.nickname=newHeroNode.nickname;
		}else {
			System.out.println("没有找到该编号");
		}
	}
	
	//删除节点
	public void del(int no) {
		HeroNode temp = head;
		boolean flag = false;//标志是否找要删除的节点
		while(true) {
			if(temp.next == null) {
				break;
			}
			if(temp.next.no == no) {
				flag = true;
				break;
			}			
			System.out.println(temp.next+"测试");//宋江
			temp = temp.next;
			System.out.println(temp.next+"测试");//卢俊义
		}
		if(flag) {
			temp.next = temp.next.next;
		}else {
			System.out.println("要删除的节点不存在");
		}
	}
	//显示链表
	public void list() {
		//判断链表是否为null
		if(head.next==null) {
			System.out.println("链表为空");
		}
		//因为头节点不能动,因此需要一个辅助变量来遍历
		HeroNode temp = head.next;
		while(true) {
			if(temp==null) {
				break;
			}
			System.out.println(temp);
			temp=temp.next;//指针后移
		}
	}
}
//定义HeroNode,每个HeroNode 对象就是一个节点
class HeroNode{
	
	public int no;
	public String name;
	public String nickname;
	public HeroNode next;//指向下一个节点
	
	//构造器
	public HeroNode(int no, String name ,String nickname) {
		this.no = no;
		this.name = name;
		this.nickname = nickname;
	}

	@Override
	public String toString() {
		return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + "]";
	}
	
}
//这玩意真废脑子
posted @ 2019-06-28 23:38  train99999  阅读(378)  评论(0编辑  收藏  举报