双向链表

 

使用带head头的双向链表实现 –水浒英雄排行榜

  1. 管理单向链表的缺点分析: 单向链表,查找的方向只能是一个方向,而双向链 表可以向前或者向后查找。
  2. 单向链表不能自我删除,需要靠辅助节点 ,而双向 链表,则可以自我删除,所以单链表删除 时节点,总是找到temp,temp是待删除节点的前一 个节点(认真体会).

代码实现

双向链表的增删改查

package com.liuq.linkedlist;

/**
 * Tips:
 *
 * @author Liuq
 * @version 2019年08月07日
 */
public class DoubleLinkedListDemo {


    public static void main(String [] args){

        // 测试
        System.out.println("DoubleLinkedListDemo Test");
        // 先创建节点
        HeroNode2 hero1 = new HeroNode2(1, "1", "11");
        HeroNode2 hero2 = new HeroNode2(2, "2", "22");
        HeroNode2 hero3 = new HeroNode2(3, "3", "33");
        HeroNode2 hero4 = new HeroNode2(4, "4", "44");
        // 创建一个双向链表
        DoubleLinkedList doubleLinkedList = new DoubleLinkedList();
        doubleLinkedList.add(hero1);
        doubleLinkedList.add(hero2);
        doubleLinkedList.add(hero3);
        doubleLinkedList.add(hero4);

        doubleLinkedList.list();
        doubleLinkedList.update(new HeroNode2(3,"33","333"));
        doubleLinkedList.list();
    }
}

// 创建一个双向链表的类
class DoubleLinkedList {

    // 先初始化一个头节点, 头节点不要动, 不存放具体的数据
    private HeroNode2 head = new HeroNode2(0, "", "");

    public HeroNode2 getHead() {
        return head;
    }

    public  void add(HeroNode2 node){

       HeroNode2 temp= head;
        while (true){
            //null 时  指向了链表的最后
            if(temp.next==null){
                temp.next=node;
                node.pre=temp;
                node.next=null;
                break;
            }
            temp=temp.next;
        }

    }
    public  void dele(HeroNode2 node){

        HeroNode2 temp= head.next;

        if(temp==null){
            return;
        }

        while (true){

            if(temp==null){
                break;
            }

            if(temp.no==node.no){
                temp.pre.next=temp.next;

                //注意这里如果是最后一个节点  这里会报空指针
                if (temp.next != null) {
                    temp.next.pre = temp.pre;
                }
            }
        }

    }

    public void update(HeroNode2 node){

        HeroNode2 temp= head.next;

        if(temp==null){
            return;
        }

        while (true){
            if(temp==null){
                break;
            }

            if(temp.no==node.no){
              //  node.next=temp.next;
             //   node.pre=temp.pre;
                temp.name = node.name;
                temp.nickname = node.nickname;
                break;
            }
            temp=temp.next;
        }

    }

    public  void list(){

        if(head.next==null){
            return;
        }

        HeroNode2 temp=head;
        while (temp!=null){

            if(temp.next==null){
                 break;
            }

            System.out.println(temp.next.toString());
            temp=temp.next;
        }

    }

}

// 定义HeroNode2 , 每个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.name = name;
        this.nickname = nickname;
    }

    // 为了显示方法,我们重新toString
    @Override
    public String toString() {
        return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + "]";
    }

}

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值