链表---单向链表之节点的修改和删除

单向链表的修改和删除操作
一、对单向链表的节点的修改:(根据节点编号进行修改)
思路:
1.首先判断链表是否为空
2.遍历链表,查找是否存在对应编号的节点
3.如果存在该节点,则对该节点的内容进行修改

实现代码如下:

public class SingleLinkedListDemo {

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 singleLinkedList = new SingleLinkedList();
	//加入节点
	singleLinkedList.add(hero1);
	singleLinkedList.add(hero2);
	singleLinkedList.add(hero3);
	singleLinkedList.add(hero4);
	//显示数据
	singleLinkedList.list();

	//测试修改节点
	//先创建期望修改后的节点
	HeroNode newHeroNode = new HeroNode(2,"黄月月","小月月");
	//修改链表中的对应编号的节点
	singleLinkedList.update(newHeroNode);
	//显示修改后的链表信息
	System.out.println("修改后的链表情况~~~~");
	singleLinkedList.list();
	
}

}
//定义SingleLinkedList  管理节点
class SingleLinkedList{
	//先初始化一个头结点,头结点不动
	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就指向了链表的最后
	//将最后这个节点的next指向新的节点
	temp.next = heroNode;
}

//修改节点信息,根据编号来修改,即编号不能修改
/*
 * 说明:
 * 1.根据newHeroNode 的 no 来修改
 */

public void update(HeroNode newHeroNode) {
	//判断是否为空
	if(head.next == null) {
		System.out.println("链表为空~~~");
		return;
	}
	//找到需要修改的节点,根据no编号
	//定义一个辅助变量
	HeroNode temp = head.next;
	boolean flag = false;//表示是否找到该节点
	while(true) {
		if(temp == null) {
			break;//已经遍历完链表
		}
		if(temp.no == newHeroNode.no) {
			//表示找到相应的节点
			flag = true;
			break;
		}
		temp = temp.next;
	}
	//根据flag判断是否找到修改的节点
	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) {
		//判断是否到链表最后
		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 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+",nick = "+nickname+"]";
	}
}

二、对单向链表的节点的删除:(根据节点的编号进行删除)
思路:
1.判断链表是否为空
2.遍历链表,找到需要删除的节点的前一个节点(temp)
3.删除节点(temp.next=temp.next.next)
说明:被删除的节点将不会有其他引用指向,会被垃圾回收机制回收。

实现代码如下:

//删除节点
	/*
	 * 思路:
	 * 1.head 不能动,需要一个temp辅助接点找到待删除节点的前一个节点
	 * 2.说明在比较时,应该是temp.next.no和需要删除的节点的no进行比较
	 */
	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;
			}
			//对链表进行遍历时,节点后移
			temp = temp.next;
		}
		//判断flag
		if(flag) {
			//找到对应的节点,可以进行删除操作
			temp.next = temp.next.next;
		}else {
			System.out.printf("要删除的节点%d不存在!!!\n",no);
		}
	}

测试方法:(在main函数中加入即可)

 //测试删除节点
		singleLinkedList.del(2);
		System.out.println("显示删除操作后的链表的情况~~~~");
		singleLinkedList.list();

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