首页 > 编程语言 >每日一算法----设计链表(java)

每日一算法----设计链表(java)

时间:2024-12-24 12:55:54浏览次数:6  
标签:---- curr index next 链表 java ListNode 节点

class MyLinkedList {
    static class ListNode {
        int val;
        int index;
        ListNode prev;
        ListNode next;

        public ListNode(int val, int index, ListNode prev, ListNode next) {
            this.val = val;
            this.index = index;
            this.prev = prev;
            this.next = next;
        }

        public ListNode(int val, int index) {
            this.val = val;
            this.index = index;
        }
    }

    ListNode head; // 虚拟头节点
    ListNode tail; // 虚拟尾节点
    
    /*
        在构造方法中初始化虚拟头结点和虚拟尾节点
    */
    public MyLinkedList() {
        head = new ListNode(-1, -1);
        tail = new ListNode(-1, -1);
        head.next = tail;
        tail.prev = head;
    }

    /**
     * 返回index索引处节点的值
     */
    public int get(int index) {
        if (index == 0) {
            return head.next.val; // index为0,返回头结点的值
        }
        ListNode curr = head.next;
        // 在链表中查找index索引处的节点
        while (curr != null && curr.index != index) {
            curr = curr.next;
        }
        if (curr == null) {//没找到
            return -1;
        } else { // 找到
            return curr.val;
        }
    }

    /**
     * 添加新的链表头节点
     */
    public void addAtHead(int val) {
        ListNode oldHead = head.next; // 旧的链表头节点
        ListNode newHead = new ListNode(val, 0, head, oldHead);
        head.next = newHead; // 虚拟节点的next指向新的链表头节点
        oldHead.prev = newHead; // 旧的链表头节点的prev指向新的链表头节点
        // 链表头部添加了一个节点,后序链表中的节点index索引需要全部++
        ListNode curr = oldHead;
        while (curr != tail) {
            curr.index++;
            curr = curr.next;
        }
    }

    /**
     * 添加新的链表尾节点
     */
    public void addAtTail(int val) {
        ListNode oldTail = tail.prev; // 旧的链表尾节点
        ListNode newTail = new ListNode(val, oldTail.index + 1, oldTail, tail);
        // 旧的链表尾节点的next指向新的链表尾节点
        oldTail.next = newTail;
        // 虚拟节点的prev指向新的链表尾节点
        tail.prev = newTail;
    }

    /**
     * 在链表第index个节点前面插入一个节点
     */
    public void addAtIndex(int index, int val) {
        ListNode curr = head.next;
        // 在链表中查找index-1索引的节点
        while (index != 0 && curr != null && curr.index != index - 1) {
            curr = curr.next;
        }
        // 如果index为0,相当于在链表头部插入节点
        if (index == 0) {
            addAtHead(val);/
            return;
        }
        if (curr == null) { // 没找到
            return;
        } else {
            // 在index索引处加入新的节点
            ListNode oldNode = curr.next;
            ListNode addNode = new ListNode(val, index, curr, oldNode);
            curr.next = addNode;
            oldNode.prev = addNode;
            // 在index处加入了新的节点,则后序节点的index值需要全部++
            ListNode c = oldNode;
            while (c != tail) {
                c.index++;
                c = c.next;
            }
        }
    }

    /**
     * 删除链表的第index个节点的数值
     */
    public void deleteAtIndex(int index) {
        ListNode curr = head.next;
        // 在链表中查找index-1索引的节点
        while (index != 0 && curr != null && curr.index != index - 1) {
            curr = curr.next;
        }
        // 如果index为0,相当于删除头节点,此时只需要将虚拟头结点的next指针向后移动一位
        if (index == 0) {
            head.next = curr.next;
            return;
        }
        if (curr == null) { // 没找到
            return;
        } else { //找到
            if (curr.next == tail) {
                return;
            }
            ListNode deleted = curr.next; // 待删除节点
            curr.next = deleted.next; // 删除节点操作
            deleted.next.prev = curr; // 重新建立双向链表
            ListNode c = deleted.next; 
            while (c != tail) {
                c.index--; // 删除一个节点,后序节点的index全部需要-1
                c = c.next;
            }
        }
    }
}

标签:----,curr,index,next,链表,java,ListNode,节点
From: https://blog.csdn.net/m0_74117790/article/details/144691781

相关文章

  • Springboot进口零食销售网站74r3o(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,零食信息,类型开题报告内容研究背景随着互联网技术的飞速发展和消费者购物习惯的深刻变革,电子商务已成为推动全球经济增长的重要力量。进口零食作为日常消......
  • Springboot紧急自救知识教学与交流平台9c75u(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,灾害类型,历史案例,教学课程,课程购买,紧急通知开题报告内容一、课题来源及研究目的和意义在现代社会,自然灾害与突发事件频发,公众对于紧急自救知识的需求......
  • 三目运算符的使用
    Timing_Length=(Timing_Length==3)?0:Timing_Length++;在C语言(以及很多类似的编程语言中),三目运算符(?:)要求其第二和第三操作数(也就是?后面和:后面的表达式)是能返回一个确定值的常规表达式。在Timing_Length=(Timing_Length==3)?0:Timing_Length++;这个语句里,Ti......
  • Ubuntu22.04 LTS 安装nvidia显卡驱动
    准备跑老师给定的Github上的多模态源码,但是用了这么久ubuntu还没有尝试过安装nvidia驱动,好在也是一次成功,于是记录下来。借鉴的是https://blog.csdn.net/Eric_xkk/article/details/131800365这篇文章,按照流程来基本没有问题,不过个人觉得有些步骤比较冗余,所以记录下来主要流程关......
  • cvxp
    WhenusingCVXPY,thespecificalgorithmusedforsolvingtheoptimizationproblemdependsonthesolveryouchoose.Eachsolverimplementsaspecificalgorithm.Belowisabreakdownofcommonlyusedsolversandtheirassociatedalgorithms,aswellashow......
  • 301 字符串匹配例题 exkmp
    //301字符串匹配例题.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。///*http://oj.daimayuan.top/course/22/problem/908给你两个字符串a,b,字符串均由小写字母组成,现在问你b在a中出现了几次。输入有多组数据,第一行为数据组数T,每组数据包含两行输入......
  • E91 换根DP P3647 [APIO2014] 连珠线
    视频链接:E91换根DPP3647[APIO2014]连珠线_哔哩哔哩_bilibili    P3647[APIO2014]连珠线-洛谷|计算机科学教育新生态(luogu.com.cn)//换根DPO(n)#include<iostream>#include<cstring>#include<algorithm>#include<vector>usingnamespacestd......
  • 中年程序员的新赛道:摆摊?(附赠原味牛杂和卤味摆摊教程)
    中年程序员的职业困境在当今竞争激烈的职场环境中,中年程序员面临着诸多挑战。随着年龄的增长,身体机能逐渐下降,长时间的高强度工作变得越发吃力。与此同时,职场的竞争压力却丝毫未减,年轻一代程序员如雨后春笋般涌现,他们往往对新技术有着更敏锐的洞察力和更快的学习速度,这使得中年......
  • stm32f407 cubemx lwip的简易服务器客户端收发项目
    元器件:野火stm32f407开发板技术:lwiptcp/ip内容:搭建的stm32服务器,可以接受和发送数据到客户端项目实现图片stm32通过串口发送数据客户端接受到数据客户端发送数据stm32收到数据**代码可以在我的主业进行下载**......
  • AI智能体引领未来:展望2025年
    AI智能体引领未来:展望2025年机器AI学习数据AI挖掘 2024年12月22日19:05 安徽人工智能(AI)代理,借助尖端的生成式人工智能(GenAI)技术,预计到2025年将成为技术领域最具颠覆性的力量。这些能够执行复杂任务且仅需最少人工干预的自主系统,正准备革新行业、重新定义工作流程并提升生......