2021-04-09

Java双向链表按顺序添加节点

添加方法 :这里我用的是temp等于当前节点,也可以使用temp等于下一个节点进行操作(这里没有写)

	//双向链表按顺序添加节点
	public void addByOrder(HeroNode2 heroNode) {
		//因为头节点不能动,因此要使用一个辅助指针(变量)来帮助找到添加位置
		//因为是双向链表,所以只要找当前节点就可以了,
		HeroNode2 temp = head;//这里不能在使用下一个节点,要使用当前节点
		boolean flag = false;
		while(true) {
			if(temp.no > heroNode.no) {//位置已经找到,就在temp后面插入
				break;
			}else if(temp.no == heroNode.no){//这个时候说明希望添加的heroNode的编号已经存在
				flag = true;//说明编号已经存在
			}
			//这里是为了遍历最后一个节点,所以要放在判断后面
			if(temp.next == null) {//说明temp已经在链表的最后
				break;
			}
			temp = temp.next;//将下标移向下一个,后移,遍历当前链表
		}
		if(flag) {
			System.out.printf("准备插入到英雄的编号%d已经存在了,不能加入\n",heroNode.no);
		}else {
			//先判断是否在最后一个节点
			if(temp.next != null) {
				//单向链表连接
				heroNode.next = temp;
				temp.pre.next = heroNode;
				//双向链表连接
				heroNode.pre = temp.pre;
				temp.pre = heroNode;
			}else {
				//判断要放在最后一个节点的前面还是后面
				if(temp.no > heroNode.no) {
					//添加在最后一个节点的前面
					//单向链表连接
					heroNode.next = temp;
					temp.pre.next = heroNode;
					//双向链表连接
					heroNode.pre = temp.pre;
					temp.pre = heroNode;
				}else {
					//添加在最后一个节点的后面
					temp.next = heroNode;
					heroNode.pre = temp;
				}
			}
		}
	}

创建链表

class DoubleLinkedList{
	//先初始化一个头节点,头节点不要动,不存放具体的数据
	/*
	 * 这里就是创建一个链表
	 * head 是这个链表的头
	 */
	private HeroNode2 head = new HeroNode2(0, "", "");//不要动头节点,不然后面会找不到
	//返回头节点
	public HeroNode2 getHead() {
		return head;
	}
	//添加节点
	public void add(HeroNode2 heroNode) {
		//因为head节点不能动,因此我们需要一个辅助遍历temp
		HeroNode2 temp = head;
		//遍历链表,找到最后一个节点
		while(true) {
			//找到链表的最后
			if(temp.next == null) {
				break;
			}
			//如果没有找到最后,就将temp后移
			temp = temp.next;
		}
		//当退出while循环时,temp就指向了最链表后的节点
		temp.next = heroNode;
		heroNode.pre = temp;
	}
	//双向链表按顺序添加节点
	public void addByOrder(HeroNode2 heroNode) {
		//因为头节点不能动,因此要使用一个辅助指针(变量)来帮助找到添加位置
		//因为是双向链表,所以只要找当前节点就可以了,
		HeroNode2 temp = head;//这里不能在使用下一个节点,要使用当前节点
		boolean flag = false;
		while(true) {
			if(temp.no > heroNode.no) {//位置已经找到,就在temp后面插入
				break;
			}else if(temp.no == heroNode.no){//这个时候说明希望添加的heroNode的编号已经存在
				flag = true;//说明编号已经存在
			}
			//这里是为了遍历最后一个节点,所以要放在判断后面
			if(temp.next == null) {//说明temp已经在链表的最后
				break;
			}
			temp = temp.next;//将下标移向下一个,后移,遍历当前链表
		}
		if(flag) {
			System.out.printf("准备插入到英雄的编号%d已经存在了,不能加入\n",heroNode.no);
		}else {
			//先判断是否在最后一个节点
			if(temp.next != null) {
				//单向链表连接
				heroNode.next = temp;
				temp.pre.next = heroNode;
				//双向链表连接
				heroNode.pre = temp.pre;
				temp.pre = heroNode;
			}else {
				//判断要放在最后一个节点的前面还是后面
				if(temp.no > heroNode.no) {
					//添加在最后一个节点的前面
					//单向链表连接
					heroNode.next = temp;
					temp.pre.next = heroNode;
					//双向链表连接
					heroNode.pre = temp.pre;
					temp.pre = heroNode;
				}else {
					//添加在最后一个节点的后面
					temp.next = heroNode;
					heroNode.pre = temp;
				}
			}
		}
	}
	//修改节点信息
	public void update(HeroNode2 newHeroNode) {
		//判断链表是否为空
		if(head.next == null) {
			System.out.println("链表为空~");
			return;
		}
		//找到需要修改的节点,根据no编号
		//定一个辅助变量
		HeroNode2 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);
		}
	}
	//删除节点
	//1,对于双向链表,我们可以直接找到要删除的这个节点
	//2,找到后,自我删除即可
	public void del(int no) {
		if(head.next == null) {
			System.out.println("链表为空,不能删除!");
			return;
		}
		HeroNode2 temp = head.next;//这里是为了防止第一个节点删除不掉,所以不等于head.next
		boolean flag = false ;//标志是否找到待删除节点的
		while(true) {
			if(temp.next == null) {//已经到链表的最后
				break;
			}
			if(temp.no == no) {//temp.next要删除节点的前一个节点
				//说明已经找到待删除节点的前一个节点temp
				flag = true;
				break;
			}
			temp = temp.next;//temp后移,实现遍历
		}
		if(flag) {
			//可以删除
			temp.pre.next = temp.next;
			if(temp.next != null) {//防止删除位置在最后,会出现空指针异常
				temp.next.pre = temp.pre;
			}
		}else {
			System.out.printf("要删除的%d节点不存在\n",no);
		}
	}
	//显示链表[遍历]
		public void list() {
			//判断链表是否为空
			if(head.next == null) {
				System.out.println("链表为空");
			}
			//因为头节点不能动,因此我们需要一个辅助变量来遍历
			HeroNode2 temp = head.next;
			while(true) {
				//判断是否到链表的最后
				if(temp == null) {
					break;
				}
				//输出节点的信息
				System.out.println(temp);
				//将temp后移,一定小心,否则就是死循环
				temp = temp.next;
			}
		}
}

创建节点

class HeroNode2{
	public int no;//用于存数数据
	public String name;//用于存数数据
	public String nickname;//用于存数数据
	public HeroNode2 next;//指向下一个节点
	public HeroNode2 pre;//指向上一个节点
	//构造器
	public HeroNode2(int no, String name, String nickname) {
		this.no = no;
		this.name = name;
		this.nickname = nickname;
	}
	//为了显示方法,我们重写toString
	@Override
	public String toString() {
		return "HeroNode2 [no=" + no + ", name=" + name + ", nickname=" + nickname
				+ "]";
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值