双向链表简介以及使用Java代码实现

一:双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。

 

 二:使用代码实现

public class 双向链表 {
    public static void main(String[] args) {
        HeroNode2 name1=new HeroNode2(1,"小袁","世界上最帅的男人");
        HeroNode2 name2=new HeroNode2(2,"xx","xx");
        HeroNode2 name3=new HeroNode2(3,"符爱云","我愚蠢的组员");
        HeroNode2 name4=new HeroNode2(4,"vv","xx");
        SingleLinkedList2 singleLinkedList=new SingleLinkedList2();
        singleLinkedList.add(name1);
        singleLinkedList.add(name4);
        singleLinkedList.add(name3);
        singleLinkedList.add(name2);
        singleLinkedList.list();
        System.out.println("修改后---------------");
        HeroNode2 n=new HeroNode2(2,"陆云杰","我愚蠢的组员");
        singleLinkedList.update(n);
        singleLinkedList.list();
        System.out.println("删除后--------------");
        singleLinkedList.delete(4);
        singleLinkedList.list();
    }
    }



class SingleLinkedList2 {
    //定义头节点,不存放具体数据
    private HeroNode2 head = new HeroNode2(0, "", "");
    //返回头节点
    public HeroNode2 getHead(){
        return  head;
    }
    // 添加一个节点到双向链表的最后.
    public void add(HeroNode2 heroNode) {

        // 因为head节点不能动,因此我们需要一个辅助遍历 temp
        HeroNode2 temp = head;
        // 遍历链表,找到最后
        while (true) {
            // 找到链表的最后
            if (temp.next == null) {//
                break;
            }
            // 如果没有找到最后, 将将temp后移
            temp = temp.next;
        }
        // 当退出while循环时,temp就指向了链表的最后
        // 形成一个双向链表
        temp.next = heroNode;
        heroNode.pre = temp;
    }
    //定义修改节点方法
    public  void update(HeroNode2 newHeroNode){
        if(head.next==null){
            System.out.println("链表为空");
            return;
        }
        //定义辅助变量
        HeroNode2 temp=head.next;
        //定义标志
        boolean flag=false;
        while (true) {
            if (temp == null) {
                break;
            }
            if(temp.SerialNumber==newHeroNode.SerialNumber){
                flag=true;
                break;
            }
            temp=temp.next;
        }
        if(flag){
            temp.name=newHeroNode.name;
            temp.information=newHeroNode.information;
        }else {
            System.out.println("没有找到");
        }
    }
    //双向链表可以直接找到,自我删除。
    public void delete(int SerialNumber){
        if(head.next==null){
            System.out.println("链表为空");
            return;
        }
        HeroNode2 temp=head.next;
        boolean flag=false;
        while (true){
            if(temp==null){
                break;
            }
            if(temp.SerialNumber==SerialNumber){
                flag=true;
                break;
            }
            temp=temp.next;
        }
        if(flag){
            temp.pre.next=temp.next;
            if(temp.next!=null) {
                temp.next.pre = temp.pre;
            }
        }
    }
    //遍历
    public void list(){
        //判断链表是否为空
        if(head.next==null){
            System.out.println("链表为空");
            return;
        }
        //定义辅助变量
        HeroNode2 temp=head.next;
        while (true){
            //判断是否到链表最后
            if(temp==null){
                break;
            }
            System.out.println(temp);
            //将temp后移,不然会死循环
            temp=temp.next;
        }
    }
}
class HeroNode2{
    public int SerialNumber;
    public String name;
    public String information;
    public HeroNode2 next;  //指向下一个节点,默认为null
    public HeroNode2 pre;//指向前一个节点,默认为null
    public HeroNode2(int SerialNumber,String name,String information){
        this.SerialNumber=SerialNumber;
        this.name=name;
        this.information=information;
    }

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

 

posted @ 2021-02-06 21:59  袁志航  阅读(384)  评论(2编辑  收藏  举报