首页 > 文章列表 > 怎么用java代码实现双向链表

怎么用java代码实现双向链表

java
414 2023-04-28

怎么用java代码实现双向链表

一、双向链表简介

1、单链表的缺陷

单链表只能从头结点开始访问链表中的数据元素,如果需要逆序访问单链表中的数据元素将极其低效。

2、双向链表的结构

双链表是链表的一种,由节点组成,每个数据结点中都有两个指针,分别指向直接后继和直接前驱。

3、双向链表类的基本结构

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;

        }

 

        public HeroNode2(int no, String name) {

            this.no = no;

            this.name = name;

        }

 

        @Override

        public String toString() {

            return "HeroNode{" +

                    "no=" + no +

                    ", name='" + name + '\'' +

                    ", nickName='" + nickName + '\'' +

                    '}';

        }

    }

二、双向链表的操作

1、双向链表的插入操作

//添加节点到单向链表

        //1. 找到当前链表的最后节点

        //2. 将最后这个节点的next指定新节点

        public void add(HeroNode2 heroNode) {

            //因为head节点不能动,所以需要一个辅助变量temp

            HeroNode2 temp = head;

            while (true) {

                //根据是否有下个节点判断 是否到了链表动最后

                if (temp.next == null) {

                    break;

                }

                //如果没有找到最后 temp后移

                temp = temp.next;

            }

            //当退出循环时,temp就指向了链表的最后位置

            //当最后这个节点的next 指向新的节点

            //新节点的上一个节点指向temp

            temp.next = heroNode;

            heroNode.pre = temp;

        }

 2、双向链表的删除操作

 /**

         * 根据编号删除节点

         * 双向链表找到对应的节点直接删除

         * @param no 节点编号

         */

        public void deleteByNo(int no) {

            //判断是否链表为空

            if (head.next == null) {

                System.out.println("链表为空");

                return;

            }

            HeroNode2 temp = head;

            //设置标识

            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){

                    temp.next.pre=temp.pre;

                }

 

 

            } else {

                System.out.println("没有对应的节点无法删除");

            }

        }

}