我的Java数据结构学习-4-4---双向链表

双向链表:节点

复制代码
package Demo1.LinkeList;

public class DoubleNode {
        //双向链表的节点对象

        public int no;//编号
        public String name;//名字
        public String nickName;//昵称
        public  DoubleNode next;//指向下一个节点
        public DoubleNode pre;//指向前一个节点
        //构造器
        public DoubleNode(int no, String name, String nickName) {
            this.no = no;
            this.name = name;
            this.nickName = nickName;
        }

        public int getNo() {
            return no;
        }

        public String getName() {
            return name;
        }

        public String getNickName() {
            return nickName;
        }

        public DoubleNode getNext() {
            return next;
        }

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


}
复制代码

双向链表表对象:(增删改查)

复制代码
package Demo1.LinkeList;

public class DoubleLInkedList {
    //初始化表头
    private  DoubleNode head = new DoubleNode(0,"","");

    public DoubleNode getHead() {
        return head;
    }
    //遍历双向链表
    //显示链表信息【遍历打印链表】
    public void prinfList() {
        //判断链表是不是为空
        if (head.next == null) {
            System.out.println("链表为空::!!");
            return;
        }
        //头节点不能动,同样需要辅助遍历
        DoubleNode temp = head.next;
        while (true) {
            //判断链表是否是最后一个
            if (temp == null) {
                break;
            }
            //如果不为空
            System.out.println(temp);
            //还需要将temp后移,一定
            temp = temp.next;
        }
    }
    //添加,默认添加到双向链表的最后
    //添加节点到双向链表(顺序添加)
    public void addNode(DoubleNode heroNode) {
        //不考虑编号顺序时候,找到当前链表的最后节点,将最后的节点的next域 指向新节点
        //因为head不能动,需要辅助指针(遍历链表)
        //System.out.println(heroNode);
        DoubleNode temp = head;
        //遍历链表,找到当前链表的最后一位
        while (true) {
            //什么时候说明链表已经遍历到最后了,如果temp.next = null
            if (temp.next == null) {
                break;
            }
            //如果没有找到最后,temp的指针next域一致后移。
            temp = temp.next;
        }
        //退出while循环时,temp一定指向链表的最后
        temp.next = heroNode;
        heroNode.pre = temp;
        // prinfList();
    }
    //修改节点的信息,根据编号来修改,
    public void updateNode(DoubleNode heroNode) {
        //判断链表是不是空的
        if (head.next == null) {
            System.out.println("链表为空");
            return;
        }
        //辅助指针
        DoubleNode temp = head;
        boolean tag = false;//表示是否找到
        //找到目标节点
        while (true) {
            if (temp == null) {
                break;//已经走到了最后了,遍历完了未找到
            }
            if (temp.no == heroNode.no) {
                //找到了
                tag = true;
                break;
            }
            temp = temp.next;
        }

        if (tag) {
            temp.name = heroNode.name;
            temp.nickName = heroNode.nickName;
        } else {
            System.out.printf("未找到该【】目标节点,检查编号是否存在【%d】", heroNode.no);
        }
    }
    //删除一个节点

    //删除节点head
    public void deleteNode(int nio) {
        if (head.next == null) {
            System.out.println("链表为空!!");
            return;
        }
        DoubleNode temp = head.next;
        boolean flag = false;
        while (true) {
            if (head.next == null) {
                break;//走到了最后
            }
            if (temp.no == nio) {//找到待删除的前一个结点。
                flag = true;
                break;//找到了就退出

            }
            temp = temp.next;//temp 后移
        }
        if (flag) {
            //找了
            temp.pre.next = temp.next;
            //防止是最后一个删除
            if (temp.next!=null){
                temp.next.pre = temp.pre;
            }

        } else {
            System.out.printf("节点不存在:【%d】\n", nio);
        }
    }


}
复制代码

测试双向链表:

复制代码
package Demo1.LinkeList;

public class DoubleLinkedListTest {
    public static void main(String[] args) {
        //双向链表的测试
        System.out.println("双向链表的测试!!!");
        DoubleNode heroNode1 = new DoubleNode(1, "顺悟空", "孙行者");
        DoubleNode heroNode2 = new DoubleNode(2, "郭童", "白嫖当");
        DoubleNode heroNode3 = new DoubleNode(3, "李四", "隔壁老李");
        DoubleNode heroNode4 = new DoubleNode(4, "王五", "隔壁老五");
        DoubleLInkedList list = new DoubleLInkedList();
        list.addNode(heroNode1);
        list.addNode(heroNode2);
        list.addNode(heroNode4);
        list.addNode(heroNode3);
        list.prinfList();
        System.out.println("============================");
        //修改测试
        System.out.println("修改测试!!");
        DoubleNode heroNode = new DoubleNode(4, "王尼玛", "隔壁老王");
        list.updateNode(heroNode);
        list.prinfList();
        //删除
        System.out.println("删除后的链表::");
        list.deleteNode(2);
        list.prinfList();

    }
}
复制代码

 

posted on   白嫖老郭  阅读(73)  评论(0编辑  收藏  举报

编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示