【Java数据结构 -- 实现双链表的接口方法】

这篇具有很好参考价值的文章主要介绍了【Java数据结构 -- 实现双链表的接口方法】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.双链表

双链表是一种数据结构,其中每个节点包含一个指向前一个节点的指针和一个指向后一个节点的指针。由于链表没有将元素存储在连续的空间中,元素存储在单独的节点中,然后通过引用将节点连接起来,因此双链表可以任意且快速的插入和删除元素。
【Java数据结构 -- 实现双链表的接口方法】,Java数据结构,java,数据结构,开发语言

2.双链表的创建

引用接口IList,在把IList接口里面的方法进行重写,实现双链表的功能。把双链表封装成一个类,类中封装一个节点类ListNode,里面的节点类有当前节点的值val、指向前一个节点的ListNode prev和指向后一个节点的变量ListNode next。最后在外部类中定义头节点、尾节点,利用外部类的构造器中就可以对头尾节点的初始化。

public class MyLinkedList implements IList{
    static class ListNode {
        public int val;
        public ListNode next;
        public ListNode prev;

        public ListNode(int val) {
            this.val = val;
        }
    }
    public ListNode head;
    public ListNode last;
}

3.双链表的头插节点

头插node节点,如果链表为空,直接把插入的节点设为头尾节点,不为空把node的下一个节点指向head头节点,再把head的前节点指向node,最后把head指向node。
【Java数据结构 -- 实现双链表的接口方法】,Java数据结构,java,数据结构,开发语言

    public void addFirst(int data) {
        ListNode node = new ListNode(data);

        if (head == null) {
            head = node;
            last = node;
        }else {
            node.next = head;
            head.prev = node;
            head = node;
        }
    }

4.双链表尾插

尾插node节点,如果链表为空,直接把插入的节点设为头尾节点,不为空把last尾节点的next(即后节点)指向node,再把node的前节点prev指向last,最后把尾节点last指向node。
【Java数据结构 -- 实现双链表的接口方法】,Java数据结构,java,数据结构,开发语言

    @Override
    public void addLast(int data) {
        ListNode node = new ListNode(data);
        if (head == null) {
            head = node;
            last = node;
        }else {
            last.next = node;
            node.prev = last;
            last = node;
        }
    }

5.双链表根据索引找节点

定义一个count变量来计数,从头节点开始遍历,当计数值为索引值退出循环,返回cur为插入节点的后节点。

    private ListNode findIndex(int index) {
        int count = 0;
        ListNode cur = head;
        while (count != index) {
            count++;
            cur = cur.next;
        }
        return cur;
    }

6.双链表根据索引插入节点

根据索引插入可分三种情况:

  • 当在最前面插入节点时为头插法
  • 在最后一个位置插入则是尾插法
  • 中间插入时遍历链表找到插入节点为node的下标,然后1:把node的后节点指向cur 即node.next = cur;2:把cur前节点的后节点指向node,即cur.prev.next = node;3:把node的前节点指向cur的前节点,即node.prev = cur.prev;4:把cur的前节点指向node,即cur.prev = node。
    【Java数据结构 -- 实现双链表的接口方法】,Java数据结构,java,数据结构,开发语言
    @Override
    public void addIndex(int index, int data) throws IndexException{
        if (index < 0 || index > size()) {
            throw new IndexException("双向链表插入,index不合法"+index);
        }

        ListNode node = new ListNode(data);
        // 在0位置就是头插法
        if(index == 0) {
            addFirst(data);
            return;
        }

        // 在最后一个位置插入
        if (index == size()) {
            addLast(data);
            return;
        }

        // 中间
        ListNode cur = findIndex(index);
        node.next = cur;
        cur.prev.next = node;
        node.prev = cur.prev;
        cur.prev = node;
    }
}

7.双链表删除值为key的节点

遍历链表,若cur.val为key,删除cur节点

  • 若cur为head头节点时,把head指向head的后节点,当head不为空时,把head的前节点直接置为null,只有一个节点时直接把last指向null。
  • 当cur不等于头节点head时,把cur前节点的后节点指向cur的后节点,即:cur.prev.next = cur.next。若cur的后节点不为空即删除中间节点时:把cur的后节点的前节点指向cur的前节点,即:cur.next.prev = cur.prev,若cur为尾节点时,把last指向last的前节点,即:last = last.prev。
  • 【Java数据结构 -- 实现双链表的接口方法】,Java数据结构,java,数据结构,开发语言
    @Override
    public void remove(int key) {
        ListNode cur = head;
        while (cur != null) {
            if (cur.val == key) {
                if (cur == head) {
                    head = head.next;
                    if (head != null) {
                        head.prev = null;
                    }else {
                        //只有一个节点 且是需要删除的节点
                        last = null;
                    }
                }else {
                    cur.prev.next = cur.next;
                    //删除中间节点
                    if (cur.next != null) {
                        //cur.prev.next = cur.next;
                        cur.next.prev = cur.prev;
                    }else {
                        // 删除尾巴节点
                        //cur.next.prev = cur.next;
                        last = last.prev;
                    }
                }
                return;
            }
            cur = cur.next;
        }
    }

8.删除所有值为key的节点

即上面删除完第一个key的节点之后不跳出循环,接着删除。文章来源地址https://www.toymoban.com/news/detail-794885.html

    @Override
    public void removeAllKey(int key) {
        ListNode cur = head;
        while (cur != null) {
            if (cur.val == key) {
                if (cur == head) {
                    head = head.next;
                    if (head != null) {
                        head.prev = null;
                    }else {
                        //只有一个节点 且是需要删除的节点
                        last = null;
                    }
                }else {
                    cur.prev.next = cur.next;
                    //删除中间节点
                    if (cur.next != null) {
                        //cur.prev.next = cur.next;
                        cur.next.prev = cur.prev;
                    }else {
                        // 删除尾巴节点
                        //cur.next.prev = cur.next;
                        last = last.prev;
                    }
                }
            }
            cur = cur.next;
        }
    }

9.双链表是否包含值为key节点

    @Override
    public boolean contains(int key) {
        ListNode cur = head;
        while (cur != null) {
            if (cur.val == key) {
                return true;
            }
            cur = cur.next;
        }
        return false;
    }

10.双链表大小

    @Override
    public int size() {
        int count = 0;
        ListNode cur = head;
        while (cur != null) {
            count++;
            cur = cur.next;
        }
        return count;
    }

11.清空双链表

    @Override
    public void clear() {
        ListNode cur = head;
        while (cur != null) {
            ListNode curNext = cur.next;
            cur.next = null;
            cur.prev = null;
            cur = curNext;
        }
        this.head = null;
        this.last = null;
    }

12.打印双链表

    @Override
    public void display() {
        ListNode cur = head;
        while (cur != null) {
            System.out.print(cur.val + " ");
            cur = cur.next;
        }
        System.out.println();
    }

到了这里,关于【Java数据结构 -- 实现双链表的接口方法】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 数据结构之双链表的相关知识点及应用

    数据结构之双链表的相关知识点及应用

     找往期文章包括但不限于本期文章中不懂的知识点: 个人主页 :我要学编程(ಥ_ಥ)-CSDN博客 所属专栏 :数据结构 目录 双链表的实现  初始化双链表  在双链表中尾插数据  在双链表中尾删数据 在双链表中头插数据  在双链表中头删数据  在双链表中的指定位置之后插入

    2024年04月26日
    浏览(40)
  • 【数据结构】 循环双链表的基本操作 (C语言版)

    【数据结构】 循环双链表的基本操作 (C语言版)

    目录 一、循环双链表 1、循环双链表的定义: 2、循环双链表的优缺点: 二、循环双链表的基本操作算法(C语言)    1、宏定义  2、创建结构体 3、循环双链表的初始化  4、循环双链表按位查找 5、循环双链表插入 6、循环双链表查找 7、循环双链表删除 8、求循环双链表长

    2024年01月22日
    浏览(40)
  • 【一起学数据结构与算法】Java实现双链表

    【一起学数据结构与算法】Java实现双链表

    双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。 打印双链表非常简单,只需要单独创一个结点

    2024年02月22日
    浏览(18)
  • 【玩转408数据结构】线性表——双链表、循环链表和静态链表(线性表的链式表示 下)

    【玩转408数据结构】线性表——双链表、循环链表和静态链表(线性表的链式表示 下)

            在前面的学习中,我们已经了解到了链表(线性表的链式存储)的一些基本特点,并且深入的研究探讨了单链表的一些特性,我们知道,单链表在实现插入删除上,是要比顺序表方便的,但是,单链表中每个结点仅存在一个指针指向其后续结点,那么如果我们想要找

    2024年04月10日
    浏览(41)
  • 数据结构——链表的实现(Java版)

    目录 一、链表 二、代码实现 1.创建结点 2.构造函数 3.链表的相关属性 4.添加虚拟节点 5.判断链表是否为空 6.添加方法 (1)在头部添加 (2)在尾部添加 (3)在索引位置添加 (4)对头插法和尾插法代码进行简化(调用任意位置添加的方法) 7.打印链表(遍历,重写toString方

    2024年01月23日
    浏览(7)
  • java数据结构与算法:双链表 LinkedList
  • 【数据结构】数组、双链表代码实现

    【数据结构】数组、双链表代码实现

    💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢迎在文章下方留下你的评论和反馈。我期待着与你分享知识、互

    2024年02月19日
    浏览(8)
  • 【数据结构】单链表 && 双链表(链式和数组实现)

    【数据结构】单链表 && 双链表(链式和数组实现)

           🔥🔥 欢迎来到小林的博客!!       🛰️博客主页:✈️小林爱敲代码       🛰️博客专栏:✈️ 数据结构与算法       🛰️社区 :✈️ 进步学堂       🛰️欢迎关注:👍点赞🙌收藏✍️留言 今天给大家带来四个内容,一个

    2024年02月01日
    浏览(40)
  • 【算法基础】数据结构| 单链表+双链表 代码实现+图解+原理

    【算法基础】数据结构| 单链表+双链表 代码实现+图解+原理

    博主简介: 努力学习的预备程序媛一枚~ 博主主页: @是瑶瑶子啦 所属专栏: Java岛冒险记【从小白到大佬之路】 因为瑶瑶子正在备战蓝桥杯和校内ACM选拔赛,最近在学习算法相关的知识。我是借助 AcWing网站 来学习的,这篇文章是我学习就我学习内容的一个笔记,其中的一些

    2024年02月01日
    浏览(52)
  • 【数据结构】链表(单链表与双链表实现+原理+源码)

    【数据结构】链表(单链表与双链表实现+原理+源码)

    博主介绍:✌全网粉丝喜爱+、前后端领域优质创作者、本质互联网精神、坚持优质作品共享、掘金/腾讯云/阿里云等平台优质作者、擅长前后端项目开发和毕业项目实战✌有需要可以联系作者我哦! 🍅附上相关C语言版源码讲解🍅 👇🏻 精彩专栏推荐订阅👇🏻 不然下次找

    2024年01月24日
    浏览(264)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包