单链表的增删改查

package com.lhy.test;

import java.util.LinkedList;

public class SingleLinkedList {
	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, "林冲", "豹子头");

		//创建一个链表
		LinkList LinkedList = new LinkList();
		//加入
		/*LinkedList.add(hero1);
		LinkedList.add(hero2);
		LinkedList.add(hero3);
		LinkedList.add(hero4);*/

		//加入按照编号顺序
		LinkedList.addByOrder(hero1);
		LinkedList.addByOrder(hero4);
		LinkedList.addByOrder(hero2);
		LinkedList.addByOrder(hero3);

		//显示(修改之前)
		LinkedList.list();
		System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");

		//测试修改节点的代码
		HeroNode newHeroNode = new HeroNode(2,"小卢","玉麒麟~~~");
		LinkedList.update(newHeroNode);
		//显示(修改之后)
		LinkedList.list();
		System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");

		//删除
		LinkedList.delete(2);
		LinkedList.list();
	}
}
//定义SingleLinkedList管理节点
class LinkList{
	//先初始化一个头结点,头结点不动,不存放具体数据
	private HeroNode head = new HeroNode(0, "", "");

	//添加节点到单向链表
	//当不考虑编号的顺序时,1、找到链表的最后节点。2、将最后节点的next域 指向新节点
	public void add(HeroNode heroNode){

		//因为head节点不能动,因此我们需要一个辅助遍历temp
		HeroNode temp = head;
		//遍历链表找到最后
		while(true){
			//找到链表的最后
			if(temp.next==null){
				break;
			}
			//如果没有找到就将temp后移
			temp = temp.next;
		}
		//当退出while循环时temp指向链表的最后
		temp.next = heroNode;
	}

	//add节点的第二种方式(如果添加编号已经存在,则添加失败)
	public void addByOrder(HeroNode heroNode){
		//因为头结点不能动,因此我们仍然通过一个辅助指针(变量)来帮助找到添加的位置
		//因为单链表,因此我们找的temp是位于添加位置的前一个节点
		HeroNode temp = head;
		boolean flag = false; //标识添加的编号是否存在,默认为FALSE
		while(true){
			if(temp.next == null){//说明temp已经在链表的最后
				break;
			}
			if(temp.next.no>heroNode.no){//位置找到了,就在temp后面插入
				break;
			}else if (temp.next.no == heroNode.no) {//说明希望添加的heroNode编号已经存在
				flag=true;//编号存在
				break;
			}
			temp = temp.next;//后移,遍历当前链表
		}
		//判断flag的值
		if(flag){//不能添加,说明编号已经存在
			System.out.println("准备插入的编号"+heroNode.no+"已经存在");
		}else{
			//插入到链表中,temp后面
			heroNode.next = temp.next;
			temp.next = heroNode;
		}
	}

	//修改节点的信息,根据编号No修改,即编号no不能修改。
	//说明
	//1、根据newHeroNode 的no进行修改
	public void update(HeroNode newHeroNode){
		if(head.next == null){
			System.out.println("链表为空~");
			return;
		}
		//找到需要修改的节点,根据no(先定义一个辅助变量)
		HeroNode temp = head;
		boolean flag = false; //标识添加的编号是否存在,默认为FALSE
		while(true){
			if(temp.next == 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.println("没有找到编号"+newHeroNode.no+"的节点,不能修改\n");
		}
	}

	//删除节点
	public void delete(int no){
		HeroNode temp = head;
		boolean flag = false;//标识是否找到待删除节点
		while (true){
			if(temp.next == null){//已经遍历到最后
				break;
			}
			if(temp.next.no == no){//找到要删除的节点的前一个节点
				flag = true;//标识
				break;
			}
			temp = temp.next;//temp后移
		}
		if(flag){//找到节点
			//可以删除
			temp.next = temp.next.next;
		}else{
			System.out.println("要删除的节点"+no+"不存在");
		}
	}


	//显示链表【遍历】
	public void list(){
		//判断链表是否为空
		if(head.next==null){
			System.out.println("链表为空");
			return;
		}
		//因为头结点不能动,需要一个辅助变量
		HeroNode temp = head.next;
		while(true){
			//判断是否到链表最后
			if(temp==null){
				break;
			}
			//输出节点的信息
			System.out.println(temp);
			//将temp后移
			temp = temp.next;
		}
	}
}
//定义一个HeroNode,每一个HeroNode就是一个节点
class HeroNode{
	public int no;
	public String name;
	public String nickName;
	public HeroNode next;//指向下一个节点
	//构造器
	public HeroNode(int hNo,String hName,String hNickName){
		this.no = hNo;
		this.name = hName;
		this.nickName = hNickName;
	}
	//为了显示方便,重写toString
	@Override
	public String toString() {
		return "HeroNode [name=" + name + ", nickName="
				+ nickName + ", no=" + no + "]";
	}
}

你可能感兴趣的:(数据结构)