3.双向链表

使用带head头的双向链表实现-水浒英雄排行榜管理的优缺点分析

  1.单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找

  2.单向项链表不能自我删除,需要靠辅助节点,啊,双向链表可以自我删除,所以前面我们单链表删除时,总是找到temp(待删除节点的前一个节点)

新增:
     /**
     * 1.添加到末尾
     *
     * @param node
     */
    public void add(HeroNode2 node) {
        //定义一个临时变量,因为head不能变化,所以定义一个中间变量
        HeroNode2 tmp = head;
        //找到队列的最后一个元素,最后一个元素的next=null
        while (tmp.getNext() != null) {
            tmp = tmp.getNext();
        }
        tmp.setNext(node);
        //多这一行
        node.setPre(tmp);
    }
    
删除:
    /**
     * 根据编号删除
     *
     * @param no
     */
    public void delete(int no) {
        HeroNode2 temp = head.getNext();
        //找到需要删除的节点
        boolean flag = true;
        while (true) {
            if (temp == null) {
                flag = false;
                break;
            }
            //tmp就是需要删除节点
            if (temp.getNo() == no) {
                break;
            }
            temp = temp.getNext();
        }
        if (flag) {
            temp.getPre().setNext(temp.getNext());
            //重点1:这里需要考虑最后一个元素的删除,最后一个元素只需要执行上面的话即可,当执行下面temp.getNext()=null,null.setpre会报空指针
            if (temp.getNext() != null) {
                temp.getNext().setPre(temp.getPre());
            }
        } else {
            System.out.println("删除失败,链表中没有该节点:" + no);
        }
    }

 测试:

  

HeroNode{no=1, name='宋江', nickName='及时雨'}
HeroNode{no=2, name='卢俊义', nickName='玉麒麟'}
HeroNode{no=3, name='吴用', nickName='智多星'}
HeroNode{no=4, name='林冲', nickName='豹子头'}
删除2节点-----
HeroNode{no=1, name='宋江', nickName='及时雨'}
HeroNode{no=3, name='吴用', nickName='智多星'}
HeroNode{no=4, name='林冲', nickName='豹子头'}

 

posted @ 2022-11-16 21:43  努力的达子  阅读(25)  评论(0编辑  收藏  举报