java的双向链表的使用

java的双向链表的使用

package 链表.双向链表;
public class Twoway_linked_list {
    public static void main(String[] args) {
        System.out.println("双向链表的测试");
        HerNode2 herNode1=new HerNode2(6,"宋江","及时雨");
        HerNode2 herNode3=new HerNode2(2,"鲁之深","倒");
        HerNode2 herNode4=new HerNode2(3,"张飞","大胡子");
        HerNode2 herNode5=new HerNode2(4,"吴用","智多星");
        HerNode2 herNode6=new HerNode2(3,"曹操","说到就到");
        HerNode2 herNode7=new HerNode2(1,"曹操","说到就到");
        DoubleHerNOdelist doubleHerNOdelist=new DoubleHerNOdelist();
        doubleHerNOdelist.AddHerNode(herNode1);
        doubleHerNOdelist.AddHerNode(herNode3);
        doubleHerNOdelist.AddHerNode(herNode4);
        doubleHerNOdelist.AddHerNode(herNode5);
        doubleHerNOdelist.ShowHerNodeList();
  /*      doubleHerNOdelist.XuoGaiLiangBiao(herNode6);
        doubleHerNOdelist.ShowHerNodeList();
        doubleHerNOdelist.Shangchuijeidian(4);
        doubleHerNOdelist.ShowHerNodeList();*/
   doubleHerNOdelist.TanJianHerNode(herNode7);
        doubleHerNOdelist.ShowHerNodeList();
    }
}
//相对单链表会多个指针,一个尾指针,一个正向指针
/*temp.next=NewHerNOde;
* NewHerNode.prep=temp*/
//创建链表
class DoubleHerNOdelist{
    //创建头节点
    private HerNode2 herNode2=new HerNode2(0,"","");
    //返回头节点
    public HerNode2 GetHerNode(){
        return herNode2;
    }
//显示节点,遍历整个链表
    public void ShowHerNodeList(){
        //判断链表是否为空,
        if(herNode2.next==null){
            System.out.println("链表为为空……");
        }
        //因为头节点不能动所以的用一个变量进行遍历
        HerNode2 temp=herNode2.next;
        while (temp!=null){//不能是temp.next!=null,这样就会只循环到倒数第二个节点就会终止运行
            System.out.println(temp);
            temp=temp.next;//节点后移
        }
        System.out.println();
    }
    //添加节点

    public void AddHerNode(HerNode2 herNode1){
        //因为头节点不能动所以用一个临时变量进行遍历,
        //遍历是为了找到节点为好添加下一个节点
        HerNode2 temp=herNode2;//用一个temp(指针)指向第一个头节点
        //遍历整个链表找到最后
        while(temp.next!=null){
            temp=temp.next;
        }
        temp.next=herNode1;//指针是至指向下一个节点的,最后一个指针的next==null;、
        herNode1.pre=temp;//指针是指向上一个节点的
    }
    //按照顺序添加节点,按照单链表一样进行添加
    public void TanJianHerNode(HerNode2 herNode){
         boolean flag=false;
          boolean flag1=false;
        //先进行判断链表是否为空
        if (herNode2.next==null){
            System.out.println("链表为空……");
            return;
        }
        HerNode2 temp=herNode2;//引用辅助指针进行遍历
        while(true){
            if (temp.next==null){
               break;
            }
            if (temp.next.no>herNode.no){//已经找到位置跳出循环,并记录位置
                flag1=true;
                break;
            }
            if (temp.no==herNode.no){
                flag=true;
                break;
            }
            temp=temp.next;
        }
        if (flag){
            System.out.println("添加的节点"+herNode.no+"已经存在不能添加");
        }   if (flag1) {
            if (temp.next == null) {
                temp.next = herNode;
                herNode.next = temp.next;
            } else {
               /* temp.next = herNode;//这样写就没有进行先拆分,是错误的
                herNode.next = temp.next;*/
                herNode.next=temp.next;//先得拆开以前的链接,然后引入下一个节点,不然会然temp会有俩个连接,会发生错误不能运行
                temp.next=herNode;
                herNode.pre = temp;
                temp.next.pre = herNode;
                System.out.println("添加节点信息完成" + herNode);

            }
        }
    }
    //修改双向链表的的泛泛和单链表一样只是链表类型不一样
    public void XuoGaiLiangBiao(HerNode2 herNode){
        boolean flag=false;
        if (herNode2.next==null){
            System.out.println("链表为空……");
            return;
        }
        HerNode2 temp=herNode2.next;
        while (true){
            if (temp==null){
                System.out.println("已经查找到链表为并未能找到节点");
                break;
            }
            if (herNode.no==temp.no){
                flag=true;
                break;
            }
            temp=temp.next;
        }
        if (flag){
            temp.name=herNode.name;
            temp.anthername=herNode.anthername;
            System.out.println("修改完成……");
            System.out.println("修改信息如下");
            System.out.println(temp);
        }

    }
    //删除节点
    //对于双向链表来说删除并不需要找到上一个节点,直接找到当前近节点
    //然后直接修改指针
    public void Shangchuijeidian(int no){
        boolean flag=false;
        if(herNode2.next==null){
            System.out.println("链表为空……");
            return;
        }
        HerNode2 temp=herNode2.next;
        while (true){
            if (temp==null){
                System.out.println("已经查到链表并未查到……");
                break;
            }
            if (no==temp.no){
                flag=true;
                break;
            }
            temp=temp.next;
        }
        if (flag) {
            //都是箭头的尾被赋值
            if (temp.next == null) {
                temp.pre.next = null;//节点上一个节点指向下一个节点方向是想向下的——》
            } else {
                temp.pre.next = temp.next;//节点上一个节点指向下一个节点方向是想向下的——》
                //如果是最后一个节点则没有下一个节点,不考虑容易产生空指针异常
                temp.next.pre = temp.pre;//节点的下一个节点的向上的指针指向temp节点的上一个节点方向为《——
                System.out.println("删除完成……");
            }
        }

    }



}
//节点就是一个类的对象
//创建一个节点,每一个节点就是一个对象
class HerNode2{
    public int no;
    public String name;
    public String anthername;
    public HerNode2 next;//指向下一个节点
    public HerNode2 pre;//指向上一个节点
    public HerNode2(int no, String name, String anthername ) {
        this.no = no;
        this.name = name;
        this.anthername = anthername;
    }
    //为了显示明显从写Tostring方法

    @Override
    public String toString() {
        return "HerNode{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", anthername='" + anthername + '\'';
    }
}

测试代码块

双向链表的测试
HerNode{no=6, name=‘宋江’, anthername=‘及时雨’
HerNode{no=2, name=‘鲁之深’, anthername=‘倒’
HerNode{no=3, name=‘张飞’, anthername=‘大胡子’
HerNode{no=4, name=‘吴用’, anthername=‘智多星’

添加节点信息完成HerNode{no=1, name=‘曹操’, anthername=‘说到就到’
HerNode{no=1, name=‘曹操’, anthername=‘说到就到’
HerNode{no=6, name=‘宋江’, anthername=‘及时雨’
HerNode{no=2, name=‘鲁之深’, anthername=‘倒’
HerNode{no=3, name=‘张飞’, anthername=‘大胡子’
HerNode{no=4, name=‘吴用’, anthername=‘智多星’

进程已结束,退出代码0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值