欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-14 22:06:56
实现水浒传排行增删改查对于英雄类,每一个类里都有指向下一个节点的引用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 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

相关标签: 数据结构 java