数据结构与算法——双向链表

双向链表示意图

在这里插入图片描述

遍历链表

        //初始化头节点
        private ListNode head = new ListNode(0);

        //返回头节点
        public ListNode getHead() {
            return head;
        }

        //显示链表(遍历)
        public void list() {

            //判断链表是否为空
            if (head.next == null) {
                System.out.println("链表为空");
                return;
            }

            //head节点不能动,创建一个辅助变量用来遍历
            ListNode temp = head.next;
            while (temp != null) {   //判断链表是否到最后
                System.out.println(temp);
                temp = temp.next;

            }

        }

添加节点

添加到最后

        //添加节点到链表最后
        public void add(ListNode listNode) {

            //head节点不能动,因此创建一个辅助变量temp
            ListNode temp = head;

            //遍历链表,找到最后
            while (temp.next != null) {
                temp = temp.next;       //没找到链表的最后
            }

            //退出while循环时,temp就指向了链表的最后
            //形成双向链表
            temp.next = listNode;
            listNode.pre = temp;

        }```
## 按顺序添加

```java
        //添加节点按照顺序
        public void addByOrder(ListNode listNode) {

            //head节点不能动,使用辅助变量temp来找到添加位置,temp位于添加位置的前一个节点
            ListNode temp = head;
            boolean flag = false;   //flag标识添加的编号是否已存在,默认为false

            //寻找插入位置
            while (temp.next != null) {   //temp在最后,直接添加
                if (temp.next.no > listNode.no) { //找到添加位置(temp后面)
                    break;
                } else if (temp.next.no == listNode.no) {  //要添加的编号已存在
                    flag = true;
                    break;
                }
                temp = temp.next;   //temp后移,遍历链表
            }

            //插入链表
            if (flag) {
                System.out.printf("准备插入的编号%d已存在\n", listNode.no);
            } else {
                //在temp的后面插入数据
                listNode.next = temp.next;      //listNode指向temp后面的节点
                temp.next = listNode;           //temp指向listNode
                listNode.pre = temp;
                if(listNode.next != null)
                    listNode.next.pre = listNode;
            }

        }

修改节点

        //修改节点
        public void update(ListNode newListNode) {

            //判断是否为空
            if (head.next == null) {
                System.out.println("链表为空");
                return;
            }

            //找到需要修改的节点,根据no编号
            ListNode temp = head.next;
            boolean flag = false;   //标识是否找到该节点
            while (temp != null) {
                if (temp.no == newListNode.no) {  //找到
                    flag = true;
                    break;
                }
                temp = temp.next;   //遍历
            }

            //判断是否已经找到要修改的节点
            if (flag) {
                //修改语句 newListNode的变量赋给temp
            } else {
                System.out.printf("没有找到编号为%d的节点\n", newListNode.no);
            }

        }

删除节点

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

            if(head.next == null){
                System.out.println("链表为空");
                return;
            }

            ListNode temp = head.next;
            boolean flag = false;   //是否找到要删除的节点

            while (temp != null) {  //直接找要删除的节点,自我删除即可
                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("未找到要删除的节点");
            }

        }

定义节点

    //创建节点
    class ListNode{

        public int no;
        public ListNode next;   //指向下一个节点
        public ListNode pre;    //指向前一个节点

        public ListNode(int no) {
            this.no = no;
        }

        @Override
        public String toString() {
            return "ListNode{" +
                    "no=" + no +
                    '}';
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值