Loading

双向链表

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

单向链表的缺点分析:

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

2)单项链表不能自我删除,需要靠辅助节点,而双向链表,可以自我删除

clipboard

public class DoubleLinkedListDemo {
    public static void main(String[] args) {
        HeroNode2 node1 = new HeroNode2(1, "宋江", "及时雨");
        HeroNode2 node2 = new HeroNode2(2, "卢俊义", "玉麒麟");
        HeroNode2 node3 = new HeroNode2(3, "吴用", "智多星");
        HeroNode2 node4 = new HeroNode2(4, "林冲", "豹子头");
        DoubleLinkedList list = new DoubleLinkedList();
        list.addByOrder(node2);
        list.addByOrder(node4);
        list.addByOrder(node3);
        list.addByOrder(node1);
        list.list();

        //修改节点
        System.out.println("=================================");
        HeroNode2 newNode = new HeroNode2(2, "庐州太太", "玉麒麟~~");
        list.update(newNode);
        list.list();

      //删除节点
        System.out.println("=================================");
        list.delete(node4);
        list.list();


    }
}

//定义一个LinkedList 来管理我们的英雄
class DoubleLinkedList{

    //定义一个头节点,不存对象
    private HeroNode2 head = new HeroNode2(0,"","");

    // 添加节点
    public void add(HeroNode2 hero){
        HeroNode2 temp = head;
        while(true){
            if(temp.next==null){
                break;
            }
            temp=temp.next;
        }
        //形成一个双向链表
        temp.next=hero;
        hero.pre=temp;
    }

    // 按照no的顺序添加节点
    public void addByOrder(HeroNode2 hero){
        HeroNode2 temp = head;
        boolean flag = false; //标志和添加的节点和链表中节点的编号没有重复
        while(true){
            if(temp.next==null){
                break;
            }
            if(temp.next.no>hero.no){
                break;
            }else if(temp.next.no==hero.no){
                flag = true;
                break;
            }
            temp =temp.next;
        }
        //此时的temp要插入节点的前一个节点
        if(temp.next!=null){
            temp.next.pre=hero;
            hero.next=temp.next;
        }
        temp.next=hero;
        hero.pre=temp;
    }

    //单链表的修改
    public void update(HeroNode2 hero){
        if(head.next==null){
            System.out.println("链表为空!!");
        }
        HeroNode2 temp = head;
        boolean flag = false; //标志是否在链表中找到 no==hero.no 的节点
        while(true){
            if(temp.next==null){
                break;
            }
            if(temp.next.no==hero.no){
                flag=true;
                break;
            }
            temp=temp.next;
        }

        if(flag){
            temp.next.name =hero.name;
            temp.next.nickName =hero.nickName;
        }else{
            System.out.printf("未在链表中找到no为%d的节点",hero.no);
        }
    }

    //节点的删除
    public void delete(HeroNode2 hero){
        if(head.next==null){
            System.out.println("链表为空!!");
        }
        HeroNode2 temp = head.next;
        boolean flag = false; //标志是否在链表中找到待删除节点
        while(true){
            if(temp==null){
                break;
            }
            if(temp.no==hero.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.printf("no为%d的节点不存在",hero.no);
        }
    }


    //显示链表【遍历】
    public void list(){
        if(head.next==null){
            System.out.println("链表为空!");
            return;
        }
        HeroNode2 temp = head;
        while(true){
            if(temp.next==null){
                break;
            }
            temp=temp.next;
            System.out.println(temp);
        }
    }




}


//定义一个HeroNode,每个 HeroNode 就是一个节点
class HeroNode2{
    public int no;
    public String name;
    public String nickName;
    public HeroNode2 next;
    public HeroNode2 pre; //指向前一个节点

    //构造器
    public HeroNode2(int no, String name, String nickName) {
        this.no = no;
        this.name = name;
        this.nickName = nickName;
    }

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

 

posted @ 2020-08-01 23:46  青岑  阅读(203)  评论(0编辑  收藏  举报