学习数据结构的第四天--双向链表

双向链表有next和pre
next:指向下一个节点
pre:指向上一个节点
遍历方式和单链表一样
按顺序添加节点:

  1. 创建辅助节点temp指向表头,创建两一个节点temp2存放temp.next
  2. 遍历链表,若temp.next=null,遍历到最后;temp.next.no>新节点.no,可以添加,并且退出循环;temp.next.no=新节点.no,表示已经存在
  3. 添加节点,如果是temp.next=null情况,直接在后面添加;如果是temp.next.no>新节点.no
                temp2=temp.next;
				temp.next=新节点;
				新节点.next=temp2;
				新节点.pre=temp;
				temp2.pre=新节点;

删除节点:

  1. 双向链表可以直接删除
  2. 找到要删除的节点为temp
  3. temp.pre.next=temp.next
  4. temp.next.pre=temp.pre;

代码如下

class ManageHeroNode2{
	 //初始化一个头结点
		private HeroNode2 head=new HeroNode2(0,"","");
		//返回一个头结点
		public HeroNode2 getHead() {
			return head;
		}

		public void setHead(HeroNode2 head) {
			this.head = head;
		}
		
		public void add(HeroNode2 HeroNode2) {
			//创建一个辅助节点
			HeroNode2 temp=head;
			while(true) {
				if(temp.next==null) {
					//表示最后一个节点
					break;
				}
				
				//指向下一个节点
				temp=temp.next;	
			}
			//循环结束之后的节点为最后一个节点
			//指向新的节点
			temp.next=HeroNode2;
			HeroNode2.pre=temp;
			
		}
		
		//显示链表
		public void list() {
			//判断链表是否为空
			if(head.next==null) {
				System.out.println("链表为空");
				return;
			}
			
			//遍历链表
			//创建一个辅助链表,head.next不是null,说明至少有一个数据
			HeroNode2 temp=head.next;
		    while(true) {
		    	//判断是否是最后一个节点
		    	if(temp==null) {
		    		break;
		    	}
		    	System.out.println(temp);
		    	//将temp后移
		    	temp=temp.next;
		    }
		}
		
		
		//删除节点
		public void delete(int no) {
			
			// 判断当前链表是否为空
			if (head.next == null) {// 空链表
				System.out.println("链表为空,无法删除");
				return;
			}

			HeroNode2 temp = head.next; // 辅助变量(指针)
			boolean flag = false; // 标志是否找到待删除节点的
			while (true) {
				if (temp == null) { // 已经到链表的最后
					break;
				}
				if (temp.no == no) {
					// 找到的待删除节点的前一个节点temp
					flag = true;
					break;
				}
				temp = temp.next; // temp后移,遍历
			}
			// 判断flag
			if (flag) { // 找到
				// 可以删除
				// temp.next = temp.next.next;[单向链表]
				temp.pre.next = temp.next;
				// 这里我们的代码有问题?
				// 如果是最后一个节点,就不需要执行下面这句话,否则出现空指针
				if (temp.next != null) {
					temp.next.pre = temp.pre;
				}
			} else {
				System.out.printf("要删除的 %d 节点不存在\n", no);
			}
		}
		
		
		//按照顺序加入节点
		public void addByOrder(HeroNode2 heroNode) {
			//新建一个辅助节点,我们要找的temp是要加入的前一个节点
			HeroNode2 temp=head;
			HeroNode2 temp2=null;//存放temp.next
			boolean flag=false;//表示节点是否存在
			while(true) {
				if(temp.next==null) {
					//最后一个节点
					break;
				}
				if(temp.next.no>heroNode.no) {
					//可以添加
					break;
				}else if(temp.next.no==heroNode.no) {
					//表示已经存在
					
					flag=true;
					break;
				}
				
				temp=temp.next;
			}
		 if(flag) {
			 System.out.println("要添加的节点已经存在");
		 }else {
			 //添加节点
			 if(temp.next==null) {
				 temp.next=heroNode;
				 heroNode.pre=temp;
			 }else {
				temp2=temp.next;
				temp.next=heroNode;
				heroNode.next=temp2;
				heroNode.pre=temp;
				temp2.pre=heroNode;
			 }
			
		 }
		}
}

//每个HeroNode2就是一个节点
class HeroNode2 {
	public int no;
	public String name;
	public String nickName;
	public HeroNode2 next;// z指向下一个节点
	public HeroNode2 pre;//指向前一个节点

	public HeroNode2(int no, String name, String nickName) {
		this.no = no;
		this.name = name;
		this.nickName = nickName;
	}

	@Override
	public String toString() {
		return "HeroNode2 [no=" + no + ", name=" + name + ", nickName=" + nickName + "]";
	}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值