双向链表(java代码实现)

单向链表和双向链表的区别

单向链表 双向链表
查找方向 单向 可以向前查找也可以向后查找
删除 需要辅助节点 不需要辅助节点

所以相对单向链表,我们需要在节点中新加入一个per指向前一个节点的域。

双向链表代码实现

写一个新的Students类,相对单链表多了pre

    class Students {

        public String name; // 学生的姓名
        public int id; // 学生的学号
        public Students pre; // 节点的前一个
        public Students next; // 节点的后一个

        public Students(String name, int id) {
            this.name = name;
            this.id = id;
        }

        @Override
        public String toString() {
            return "Student{" + "name='" + name + '\'' + ", id=" + id + '}';
        }
    }

然后是对双向链表的各种操作

    class DoubleLinkedList {
        // 创建头节点
        private Students head = new Students("", 0);

        // 遍历链表
        public void showList() {
            if (head.next == null) {
                System.out.println("链表为空");
                return;
            }

            Students temp = head.next;

            while (true) {
                if (temp == null) {
                    break;
                }
                System.out.println(temp);
                temp = temp.next;
            }
        }

        // 添加节点到双向链表的最后
        public void add(Students students) {

            Students temp = head;

            while (true) {
                if (temp.next == null) {
                    break;
                }
                temp = temp.next;
            }

            temp.next = students;
            students.pre = temp;
        }

        // 更具顺序添加节点
        public void addByOrder(Students students) {

            Students temp = head;
            boolean flag = false;

            while (true) {
                if (temp.next == null) {
                    break;
                }

                if (temp.next.id > students.id) {
                    break;
                } else if (temp.next.id == students.id) {
                    flag = true;
                    break;
                }

                temp = temp.next;
            }

            if (flag) {
                System.out.println("该节点已经存在");
            } else {
                students.next = temp.next;
                temp.next = students;
                students.pre = temp;
                // 这里存在一个当最后一个节点为空时,没有pre域,所以要进行判断。
                if (students.next != null) {
                    students.next.pre = students;
                }
            }
        }

        // 修改节点信息
        public void update(Students students) {
            if (head.next == null) {
                System.out.println("链表为空");
                return;
            }

            Students temp = head.next;
            boolean flag = false;

            while (true) {
                if (temp == null) {
                    break;
                }

                if (students.id == temp.id) {
                    flag = true;
                    break;
                }
                temp = temp.next;
            }

            if (flag) {
                temp.name = students.name;
                temp.id = students.id;
            } else {
                System.out.println("没有该节点");
            }
        }

        // 删除节点
        public void del(int num) {

            Students temp = head;
            boolean flag = false;

            while (true) {
                if (temp.next == null) {
                    break;
                }
                if (temp.next.id == num) {
                    flag = true;
                    break;
                }
                temp = temp.next;
            }

            if (flag) {
                temp.next = temp.next.next;
                // 要对是否为最后一个节点进行判断
                if (temp.next != null) {
                    temp.next.pre = temp;
                }
            } else {
                System.out.println("没有该节点");
            }
        }
    }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容