单链表实例(1)实现水浒传排行增删改查和练习

2022-08-02,,,

实现水浒传排行增删改查

对于英雄类,每一个类里都有指向下一个节点的引用

public HeroNode next;

对于添加
根据编号大小,插入

对于删除
把 要删除的节点的next赋值到被删除的上一个节点的next,即:

temp.next == temp.next.next

英雄类的定义

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;
	}
	//重写toString
	@Override
	public String toString() {
		return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + "]";
	}
}

头节点

class SingleLinkedList	{
	//初始化头节点,头节点固定
	private HeroNode head = new HeroNode(0,"","");

增加

public void addByOrder(HeroNode heroNode) {	
	//单链表,插入到添加位置的前一个位置
		HeroNode temp = head;
		boolean flag = false;//标志添加的编号是否存在,默认为false,不存在
		while(true) {
			if(temp.next == null) {
				//若temp链表在最后
				break;
			}
			if(temp.next.no>heroNode.no) {
				//如果temp的下一个位置的编号,符合,添加进去
				break;
			}
			if(temp.next.no == heroNode.no) {
				//重复了编号
				flag = true; //说明编号存在
				break;
			}
			temp = temp.next;
		}
		//退出循环后,判断flag的值
		if(flag) {
			System.out.printf("准备插入的英雄编号%d,已经存在\n",heroNode.no);
			
		}
		else {
			//插入进去
			heroNode.next = temp.next;
			temp.next = heroNode;
		}
	}

修改

//修改,根据编号来修改,no编号不能修改
	public void update(HeroNode newHeroNode) {
		//判断是否为空
		if(head.next == null) {
			System.out.println("链表为空");
			return;
		}
		HeroNode temp = head.next;
		//flag 标识
		boolean flag = false;
		
		while(true) {
			if(temp == null) {
				break;
			}
			if(temp.no == newHeroNode.no) {
				flag = true;
				break;
			}
			temp = temp.next;
		}
		if(flag) {
			temp.name = newHeroNode.name;
			temp.nickname = newHeroNode.nickname;
		}else {
			System.out.printf("没有找到%d的节点,不能修改\n",newHeroNode.no);
		}
	}

删除

//修改,根据编号来修改,no编号不能修改
	public void update(HeroNode newHeroNode) {
		//判断是否为空
		if(head.next == null) {
			System.out.println("链表为空");
			return;
		}
		HeroNode temp = head.next;
		//flag 标识
		boolean flag = false;
		
		while(true) {
			if(temp == null) {
				break;
			}
			if(temp.no == newHeroNode.no) {
				flag = true;
				break;
			}
			temp = temp.next;
		}
		if(flag) {
			temp.name = newHeroNode.name;
			temp.nickname = newHeroNode.nickname;
		}else {
			System.out.printf("没有找到%d的节点,不能修改\n",newHeroNode.no);
		}
	}

显示

public void list() {
		//判断链表是否为空
		if(head.next == null) {
			System.out.println("链表为空");
			return;
		}
		//创建辅助变量进行遍历
		HeroNode temp = head.next;
		while(true) {
			//输出节点信息
			System.out.println(temp);
			
			if(temp.next == null) {
				break;
			}
			temp = temp.next;
		}
	}

练习1、查询倒数第K个节点

public HeroNode get_K_Node(int k) {
		HeroNode temp = head.next;
		int length = 0;
		while(temp!=null) {
			length++;
			temp = temp.next;
		}
		if(k>length || k<0) {
			System.out.println("节点超出范围");
			return null;
		}
		else {
			HeroNode cus = head.next;
			System.out.println(cus+"---");
			for(int i=0;i<length-k;i++) {
				
				cus = cus.next;
				System.out.println(cus+"---");
			}
			return cus;
		}
		
	}

练习2、单链表的反转

public void mirrorHeroNode() {
		HeroNode temp = head.next;
		HeroNode mirrorNode = new HeroNode(0,"","");//新节点头
		HeroNode mirror = null;						//记录遍历节点的下一个节点,放在链表丢失
		while(temp !=null) {
			mirror = temp.next;			//记录遍历节点的下一个节点
			temp.next = mirrorNode.next;//将新节点头的下一个元素指向 要插入 的节点的下一个
			mirrorNode.next = temp;		//然后把要插入的节点加入到新节点的下一个
			temp = mirror;				//让temp移动一位
		}
		while(mirrorNode.next!=null) {
		System.out.println(mirrorNode.next);
		mirrorNode.next = mirrorNode.next.next;
		}
	}

完整代码

package com.atguigu.linkedlist;

public class SingleLinkList {
	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 list= new SingleLinkedList();
	   /*
		*list.add(hero1);
		*list.add(hero2);
		*list.add(hero3);
	    *list.add(hero4);
		*/
		list.addByOrder(hero1);
		list.addByOrder(hero4);
		list.addByOrder(hero2);
		list.addByOrder(hero3);
		list.addByOrder(hero3);
		list.list();
		System.out.println("");
		//HeroNode hero5 = new HeroNode(4,"林冲","豹子头==");
		//list.update(hero5);
		list.delete(4);
		list.list();
		
	}
}
//定义SingleLinkList  
class SingleLinkedList	{
	//初始化头节点,头节点固定
	private HeroNode head = new HeroNode(0,"","");
	//添加节点
	public void add(HeroNode heroNode) {
		//不考虑编号顺序时,找到最后节点,将next指向新节点
		//temp指向头节点
		HeroNode temp = head;
		//遍历链表
		while(true) {
			//当next == null ,即为尾节点
			if(temp.next == null) {
				break;
			}
			//指向下一个节点
			temp = temp.next;
		}
		//经过while循环,temp遍历到尾节点
		temp.next = heroNode;
	}
	//第二种添加的方法,根据编号大小
	public void addByOrder(HeroNode heroNode) {	
	//单链表,插入到添加位置的前一个位置
		HeroNode temp = head;
		boolean flag = false;//标志添加的编号是否存在,默认为false,不存在
		while(true) {
			if(temp.next == null) {
				//若temp链表在最后
				break;
			}
			if(temp.next.no>heroNode.no) {
				//如果temp的下一个位置的编号,符合,添加进去
				break;
			}
			if(temp.next.no == heroNode.no) {
				//重复了编号
				flag = true; //说明编号存在
				break;
			}
			temp = temp.next;
		}
		//退出循环后,判断flag的值
		if(flag) {
			System.out.printf("准备插入的英雄编号%d,已经存在\n",heroNode.no);
			
		}
		else {
			//插入进去
			heroNode.next = temp.next;
			temp.next = heroNode;
		}
	}
	//修改,根据编号来修改,no编号不能修改
	public void update(HeroNode newHeroNode) {
		//判断是否为空
		if(head.next == null) {
			System.out.println("链表为空");
			return;
		}
		HeroNode temp = head.next;
		//flag 标识
		boolean flag = false;
		
		while(true) {
			if(temp == null) {
				break;
			}
			if(temp.no == newHeroNode.no) {
				flag = true;
				break;
			}
			temp = temp.next;
		}
		if(flag) {
			temp.name = newHeroNode.name;
			temp.nickname = newHeroNode.nickname;
		}else {
			System.out.printf("没有找到%d的节点,不能修改\n",newHeroNode.no);
		}
	}
	//删除
	public void delete(int no) {
		HeroNode temp = head;
		boolean flag = false;
		while(true) {
			if(temp.next == null) {
				break;
			}
			if(temp.next.no == no) {
				temp.next = temp.next.next;
				flag = true;
				break;
			}
			temp = temp.next;
		}
		if(flag) {
			System.out.println("删除成功");
		}
		else {
			System.out.println("未找到元素");
		}
	}
	//显示
	public void list() {
		//判断链表是否为空
		if(head.next == null) {
			System.out.println("链表为空");
			return;
		}
		//创建辅助变量进行遍历
		HeroNode temp = head.next;
		while(true) {
			//输出节点信息
			System.out.println(temp);
			
			if(temp.next == null) {
				break;
			}
			temp = temp.next;
		}
	}	
}
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;
	}
	//重写toString
	@Override
	public String toString() {
		return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + "]";
	}
}

本文地址:https://blog.csdn.net/weixin_43628058/article/details/107373237

《单链表实例(1)实现水浒传排行增删改查和练习.doc》

下载本文的Word格式文档,以方便收藏与打印。