双向链表的遍历,添加,修改,删除

双向链表的遍历,添加,修改,删除


/**
 * 双向链表的遍历,添加,修改,删除
 * 双向链表是在单链表的每一个节点中,再设置一个指向其前驱节点的指针域,即有两个指针,一个指向后继(next),一个指向前驱(pre)
 * @author Rocco_L
 *添加思路(最后插入):
 *1.先找到双向链表的最后一个节点
 *2.temp.next = 新节点
 *3.新节点.前驱= temp
 *
 * *添加思路(中间插入,例如将s插入到p和p.next中间):
 *1.s.pre = p;  先搞定s前驱
 *2.s.next=p.next;  s后继
 *3.p.next.pre=s; 在搞定后节点的前驱
 *4.p.next = s;  最后解决前节点的后继
 *
 *删除思路
 *1.双向链表可以实现自我删除
 *2.直接找到要删除的节点, temp
 *3.temp.pre.next = temp.next
 *3.temp.next.pre = temp.pre
 *
 */

//定义节点 
class HeroNode4{
 public int no;
 public String name;
 public String nickname;
 public HeroNode4 next;
 public HeroNode4 pre;
 
 public HeroNode4(int no, String name, String nickname) {
  this.no = no;
  this.name = name;
  this.nickname = nickname;
 }
public String toString() {
  return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + "]";
 }
}
class DoubleLinkedList{
//初始化双向链表的头节点,不妨具体的值
 private HeroNode4 head =new HeroNode4(0,"","");
//返回头节点
 public HeroNode4 getHead(){
  return head;
 }
//遍历显示双向链表
 public void list(){
  //判断链表是否为空
  if(head.next == null){
   System.out.println("链表为空");
   return;
  }
//创建辅助变量来遍历
  HeroNode4 temp = head.next;
  while(true){
   
   if(temp == null){
    break;
   }
System.out.println(temp);
   //将temp后移,否则会陷入死循环
   temp = temp.next;
  }
 }
//添加一个节点到链表最后
 public void add(HeroNode4 heroNode){
  
  HeroNode4 temp = head;
  while(true){
   if(temp.next == null){
    break;
   }
   temp = temp.next;
  }
  //当退出循环时,temp就指向了链表的最后
  temp.next = heroNode;
  heroNode.pre = temp;
 }
//修改一个节点的内容
 public void update (HeroNode4 newHeroNode){
  //判断是否为空
  if(head.next == null){
   System.out.println("链表为空");
   return;
  }
  
  HeroNode4 temp =head.next;
  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){
  //判断当前链表时候为空
  if(head.next == null){
   System.out.println("链表为空");
   return;
  }
  
  HeroNode4 temp = head.next;
  boolean flag = false;
  
  while(true){
   if(temp == null){
    break;
   }
   if(temp.no == no){
    flag = true;
    break;
   }
   
   temp = temp.next;
  }
  
  if(flag){
   temp.pre.next=temp.next;
   if(temp.next !=null){   //在下一个指针不为空的情况下才能执行下一句话,否则会报NullPointerException
    temp.next.pre = temp.pre;
   }
  }else{
   System.out.printf("要删除的%d节点不存在\n",no);
  }
 }
 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值