您现在的位置是:首页 > 后台技术 > 数据结构与算法数据结构与算法

双向链表(图文)

第十三双眼睛2022-06-05【数据结构与算法】人已围观

简介双向链表

单向链表的缺点:
单向链表查找的方向只能是一个方向,而双向链表可以向前查找,也可以向后查找。
单向链表不能自我删除,需要靠辅助节点,而双向链表可以自我删除。
定义一个节点
package com.xingchen.day004;
public class HeroNode {
    public int no;
    public String name;
    public String nickName;
    public HeroNode pre;
    public HeroNode next;
    public HeroNode() {
        super();
    }
    public HeroNode(int no, String name, String nickName) {
        super();
        this.no = no;
        this.name = name;
        this.nickName = nickName;
    }
}
定义一个链表
package com.xingchen.day004;
public class DoubleLinkedList {
    private HeroNode headNode = new HeroNode(0,"","");
    // 添加node
    public void add(HeroNode node){
        HeroNode temp = headNode;
        while(true){
            if(temp.next==null){
                break;
            }
            temp = temp.next;
        }
        temp.next = node;
        node.pre = temp;
    }
    // 删除一个节点
    public void delete(int no){
        HeroNode temp=headNode;
        boolean flag=false;
        while(true){
            if(temp==null){
                break;
            }
            if(temp.no==no){
                flag=true;
                break;
            }
            temp=temp.next;
        }
        if(flag){
            temp.pre.next=temp.next;
            if(temp.next==null){
                return;
            }
            temp.next.pre=temp.pre;
        }else{
            System.out.println("节点不存在:"+no);
        }
    }
    // 根据编号来修改
    public void update(HeroNode node){
        if(headNode.next==null){
            System.out.println("链表为空");
            return;
        }
        HeroNode temp = headNode;
        boolean flag=false;
        while(true){
            if(temp==null){
                break;
            }
            if(temp.no==node.no){
                flag=true;
                break;
            }
            temp=temp.next;
        }
        if(flag){
            temp.name=node.name;
            temp.nickName=node.nickName;
        }else{
            System.out.println("没有找到要修改的节点:"+node.no);
        }
    }
    // 遍历链表
    public void list(){
        if(headNode.next==null){
            System.out.println("链表为空");
            return;
        }
        HeroNode temp = headNode.next;
        while(true){
            if(temp==null){
                break;
            }
            System.out.println(temp);
            temp=temp.next;
        }
    }
}
测试一下
package com.xingchen.day004;
public class DoubleLinkedListDemo {
    public static void main(String[] args) {
        HeroNode node1 = new HeroNode(1,"宋江","及时雨");
        HeroNode node2 = new HeroNode(2,"卢俊义","玉麒麟");
        HeroNode node3 = new HeroNode(3,"吴用","智多星");
        HeroNode node4 = new HeroNode(4,"林冲","豹子头");
        DoubleLinkedList doubleLinkedList = new DoubleLinkedList();
        doubleLinkedList.add(node1);
        doubleLinkedList.add(node2);
        doubleLinkedList.add(node3);
        doubleLinkedList.add(node4);
        System.out.println("添加之后的链表");
        doubleLinkedList.list();
        
        HeroNode node5 = new HeroNode(4,"公孙胜","入云龙");
        doubleLinkedList.update(node5);
        System.out.println("修改之后的链表");
        doubleLinkedList.list();
        
        doubleLinkedList.delete(4);
        System.out.println("删除之后的链表");
        doubleLinkedList.list();
    }
}
测试结果如下:
添加之后的链表
HeroNode [no=1, name=宋江, nickName=及时雨]
HeroNode [no=2, name=卢俊义, nickName=玉麒麟]
HeroNode [no=3, name=吴用, nickName=智多星]
HeroNode [no=4, name=林冲, nickName=豹子头]
修改之后的链表
HeroNode [no=1, name=宋江, nickName=及时雨]
HeroNode [no=2, name=卢俊义, nickName=玉麒麟]
HeroNode [no=3, name=吴用, nickName=智多星]
HeroNode [no=4, name=公孙胜, nickName=入云龙]
删除之后的链表
HeroNode [no=1, name=宋江, nickName=及时雨]
HeroNode [no=2, name=卢俊义, nickName=玉麒麟]
HeroNode [no=3, name=吴用, nickName=智多星]


 

Tags:

很赞哦! ()

上一篇:单链表(图文)

下一篇:约瑟夫问题(图文)

文章评论

    共有条评论来说两句吧...

    用户名:

    验证码:

本站推荐

站点信息

  • 网站名称:JavaStudy
  • 建站时间:2019-1-14
  • 网站程序:帝国CMS7.5
  • 文章统计246篇文章
  • 标签管理标签云
  • 统计数据百度统计
  • 微信公众号:扫描二维码,关注我们