双向链表

双向链表的定义

  双向链表也可以进行首尾连接,构成双向循环链表,如下图所示
在这里插入图片描述

双向链表的优势

  1)双向链表可以向前向后查找。
  2)单向链表不能自我删除,需要借助辅助结点,而双向链表可以自我删除。

双向链表的基础操作

双向链表的插入

双向链表尾部插入

public void add(HeroNode2 heroNode){
        //因为head是头指针,因此我们要创建一个临时变量
        HeroNode2 temp = head;
        //遍历链表,找到最后
        while (true){
            if(temp.next == null){
                break;
            }
            //如果没有找到最后,继续往后找
            temp = temp.next;
        }
        //退出循环说明找到最后一个,将最后一个指向新的节点
        temp.next = heroNode;
        heroNode.pre = temp;
    }

双向链表按编号大小进行顺序插入

思路

  1)首先循环遍历找到要插入的位置
  2)判断要插入的是否为最后一个结点
  3)(不是)根据下图的顺序进行结点与结点之间的连接
在这里插入图片描述
s.pre = p //s的前驱为p
s.next = p.next //s的后继为p的后继
p.next.pre = s //p的后继的前驱为s
p.next = s; //p的后继为s

代码实现
    public void addById(HeroNode2 heroNode2){
        HeroNode2 temp = head;
        boolean flag = false;
        while (true){
            if(temp.next == null){
                break;
            }
            if(temp.next.num > heroNode2.num){
                break;
            }else if (temp.next.num == heroNode2.num){
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag){
            System.out.println("编号已经存在");
        }else if(temp.next != null){    //不是最后一个结点
            heroNode2.pre = temp;
            heroNode2.next= temp.next;
            temp.next.pre = heroNode2;
            temp.next = heroNode2;


        }else { //是最后一个结点
            temp.next = heroNode2;
            heroNode2.next = null;
            heroNode2.pre = temp;
        }
    }

双向链表的删除

思路

  1)循环遍历找到要删除的这个结点
  2)注意要删除的结点是否为最后一个

代码实现

public void delete(int no){
        if(head.next == null){
            return;
        }
        HeroNode2 temp = head.next;
        boolean flag = false;
        while (true){
            if(temp == null){
                break;
            }
            if (temp.num == no){
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag){
            temp.pre.next = temp.next;
            if (temp.next != null) {
                temp.next.pre = temp.pre;
            }
        }else {
            System.out.println("没有该节点");
        }
    }

双向链表的修改

思路

  与单链表一致,详情查看单链表章节

代码实现

public void update(HeroNode2 heroNode){

        if(head.next == null){
            return;
        }
        HeroNode2 temp = head.next;
        boolean flag = false;
        while (true){
            if(temp == null){
                break;
            }
            if (temp.num == heroNode.num){
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if(flag){
            temp.name = heroNode.name;
            temp.nickname = heroNode.nickname;
        }else {
            System.out.println("没有找到");
        }
    }

双向链表的遍历

思路

  与单链表一致,详情查看单链表章节

代码实现

    public void list(){
        if(head.next == null){
            System.out.println("链表为空");
            return;
        }
        //因为head是头指针,因此我们要创建一个临时变量
        HeroNode2 temp = head.next;
        while (true){
            if(temp == null){
                break;
            }
            System.out.println(temp);
            temp = temp.next;
        }
    }

声明

  本文是作者在学习数据结构中的一些笔记,希望能够帮助到大家。作者才疏学浅,如有错误,欢迎批评指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值