java 双向链表循环_java实现双向链表 - osc_wov79fj7的个人空间 - OSCHINA - 中文开源技术交流社区...

package linkedList;

public class DoubleLinkedListDemo {

public static void main(String[] args) {

// TODO Auto-generated method stub

System.out.println("双向链表的测试!");

HeroNode2 hero1=new HeroNode2(1, "宋江", "及时雨");

HeroNode2 hero2=new HeroNode2(2, "卢俊义", "玉麒麟");

HeroNode2 hero3=new HeroNode2(3, "吴用", "智多星");

HeroNode2 hero4=new HeroNode2(4, "林冲", "豹子头");

DoubleLinkedList doubleLinkedList=new DoubleLinkedList();

doubleLinkedList.add(hero1);

doubleLinkedList.add(hero4);

doubleLinkedList.add(hero3);

doubleLinkedList.add(hero2);

doubleLinkedList.list();

System.out.println("更新~~~~~~~~~~~~~~~~");

HeroNode2 hero5=new HeroNode2(4, "公孙胜", "入云龙");

doubleLinkedList.upDate(hero5);

doubleLinkedList.list();

System.out.println("删除~~~~~~~~~~~~~~~~~");

doubleLinkedList.delNodeById(3);

doubleLinkedList.list();

}

}

//定义双向链表节点

class DoubleLinkedList

{

private HeroNode2 head=new HeroNode2(0, "", "");

//遍历双向链表

public void list()

{

//先判断列表是否为空

if(head.next==null)

{

return;

}

//因为头结点不能动,因此需要一个辅助变量来变量

HeroNode2 temp=head.next;

while(true)

{

if(temp==null)//如果为空

{

break;

}

else

{

//输出节点的信息

System.out.println(temp);

//将temp后移

temp=temp.next;

}

}

}

//添加

public void add(HeroNode2 heroNode)

{

//head节点不可以动,因此我们需要一个辅助遍历temp

HeroNode2 temp=head;

//遍历链表找到,找到最后

while(true)

{

//当什么情况下,说明链表带最后了

if(temp.next==null)

{

break;

}

//如果没有找到,就将指针后移

temp=temp.next;

}

//当到达了双向链表的最后

temp.next=heroNode;

heroNode.pre=temp;

}

//删除一个节点

public void delNodeById(int id)

{

if(head.next==null)

{

System.out.println("链表为空,无法删除该节点!");

}

else

{

HeroNode2 temp=head.next;

boolean flag=false;//没有找到要删除的节点

while(true)

{

if(temp==null)

{

break;

}

if(temp.no==id)

{

flag=true;//说明找到了

break;

}

temp=temp.next;

}

if(flag)

{

if(temp.next==null)

{

temp.pre.next=temp.next;

}

else

{

temp.pre.next=temp.next;

temp.next.pre=temp.pre;//这里代码存在问题,如果是最后一个节点不应该出现这句话,否则会出现空指针异常

}

}

else

{

System.out.println("没有找到要删除的节点!");

}

}

}

//更新链表

public void upDate(HeroNode2 newHeroNode)//根据新节点的编号来修改

{

//判断链表是不是为空

if(head.next==null)

{

System.out.println("链表为空!");

return;

}

//定义一个辅助变量

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的节点,不能修改!",newHeroNode.no);

}

}

//按照顺序来添加英雄

//第二种添加英雄的方法通过id的顺序来添加英雄

public void addByOrder(HeroNode2 heroNode)

{

//由于头结点不能用,依旧通过一个辅助节点来进行插入遍历

//要找的temp是添加位置的前一个节点

HeroNode2 temp=head;

boolean flag=false;//添加编号是否存在,默认为false

while(true)

{

if(temp.next==null)//说明已经到最后

{

break;

}

if(temp.next.no>heroNode.no)//插入的位置找到了,就在temp的后面插入

{

break;

}

else if(temp.next.no==heroNode.no)

{

flag=true;

break;

}

temp=temp.next;//后移,也就是

}

//判断flag的值

if(flag)//说明编号已经存在,不能在添加

{

System.out.printf("准备插入的英雄编号%d已经存在!\n",heroNode.no);

}

else

{

//插入到链表中

heroNode.next=temp.next;

heroNode.pre=temp;

temp.next.pre=heroNode;

temp.next=heroNode;

}

}

}

//定义一个HeroNode,每个HeroNode对象就是一个节点

class HeroNode2

{

public int no;

public String name;

public String nickName;

public HeroNode2 next;//指向下一个节点,初始化为null

public HeroNode2 pre;//指向前一个节点,初始化为null

//构造器

public HeroNode2(int no,String name,String nickName)

{

this.no=no;

this.nickName=nickName;

this.name=name;

}

//为了显示方便,重写toString方法

@Override

public String toString()

{

return "HeroNode [no=" + no + ", name=" + name + ", nickName=" + nickName+ "]";

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值