面试算法29:排序的循环链表

news2024/11/19 23:37:38

问题

在一个循环链表中节点的值递增排序,请设计一个算法在该循环链表中插入节点,并保证插入节点之后的循环链表仍然是排序的。
在这里插入图片描述

分析

首先分析在排序的循环链表中插入节点的规律。当在图4.15(a)的链表中插入值为4的节点时,新的节点位于值为3的节点和值为5的节点之间。这很容易理解,为了使插入新节点的循环链表仍然是排序的,新节点的前一个节点的值应该比新节点的值小,后一个节点的值应该比新节点的值大。

但是特殊情况需要特殊处理。如果新节点的值比链表中已有的最大值还要大,那么新的节点将被插入最大值和最小值之间。如果新节点的值比链表中已有的最大值还要大,那么新的节点将被插入最大值和最小值之间。
在这里插入图片描述
在上面的规则中,总是先试图从链表中找到符合条件的相邻的两个节点。如果开始的时候链表中的节点数小于2,那么应该有两种可能。第1种可能是开始的时候链表是空的,一个节点都没有。此时插入一个新的节点,该节点成为循环链表中的唯一节点,那么next指针指向节点自己,如图4.17(a)所示。第2种可能是开始的时候链表中只有一个节点,插入一个新的节点之后,两个节点的next指针互相指向对方,如图4.17(b)所示。
在这里插入图片描述

public class Test {
    public static void main(String[] args) {
        ListNode listNode1 = new ListNode(1);
        ListNode listNode2 = new ListNode(2);
        ListNode listNode3 = new ListNode(3);
        ListNode listNode4 = new ListNode(4);
        ListNode listNode5 = new ListNode(5);
        ListNode listNode6 = new ListNode(6);

        listNode1.next = listNode2;
        listNode2.next = listNode3;
        listNode3.next = listNode5;
        listNode5.next = listNode6;
        listNode6.next = listNode1;

        ListNode result = insert(listNode1, 4);
        while (result != null) {
            System.out.println(result.val);
            result = result.next;
        }
    }

    public static ListNode insert(ListNode head, int insertVal) {
        ListNode node = new ListNode(insertVal);
        if (head == null) {// 没有节点
            head = node;
            head.next = head;
        }
        else if (head.next == head) {// 只有一个节点
            head.next = node;
            node.next = head;
        }
        else {
            insertCore(head, node);
        }

        return head;
    }

    private static void insertCore(ListNode head, ListNode node) {
        ListNode cur = head;
        ListNode next = head.next;
        ListNode biggest = head;
        while (!(cur.val <= node.val && next.val >= node.val) && next != head) {
            cur = next;
            next = next.next;
            if (cur.val >= biggest.val)
                biggest = cur;
        }

        if (cur.val <= node.val && next.val >= node.val) {
            cur.next = node;
            node.next = next;
        }
        else {
            node.next = biggest.next;
            biggest.next = node;
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1105523.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

倒计时 2 天!聚焦 Arm 性能提升,助力龙蜥生态落地应用

「龙蜥社区“走进系列”MeetUp」是由龙蜥社区与生态合作伙伴联合主办的系列月度活动&#xff0c;每期走进一家企业&#xff0c;聚焦龙蜥社区和合作伙伴的技术、产品和创新动态&#xff0c;展示硬核技术&#xff0c;共建繁荣生态。 本次龙蜥社区走进Arm MeetUp 将于 10 月 20 日…

大模型相关基础(基于李沐)

InstructGPT 介绍 ChatGPT用到的技术和InstructGPT一样的技术&#xff0c;区别是InstructGPT是在GPT3上微调&#xff0c;ChatGPT是在GPT3.5上微调。 InstructGPT论文发表在2022年3月4号&#xff0c;标题是《训练语言模型使得它们能够服从人类的一些指示》。 标题解释&#…

8+NAM+分型+单细胞生信思路

今天给同学们分享一篇肿瘤NAM分型单细胞的生信文章“Comprehensive analysis of nicotinamide metabolism-related signature for predicting prognosis and immunotherapy response in breast cancer”&#xff0c;这篇文章于2023年3月8日发表在Front Immunol期刊上&#xff0…

2023年中国现制咖啡市场发展概述分析:交易笔数和客单价将持续上升[图]

受到疫情封控影响&#xff0c;咖啡线下门店受到影响&#xff0c;但线上外卖门店仍保持良好发展态势&#xff0c;整体零售规模增长稳中有升。2022年&#xff0c;中国现制咖啡总零售规模为640亿元&#xff0c;2017-2022年零售规模的年复合增长率为16.3%。受益于资本关注、茶饮品牌…

安徽怀宁领导一行莅临蓝海彤翔集团参观考察

10月17日上午&#xff0c;中共怀宁县委书记余学峰&#xff0c;怀宁县政府副县长谭宪锋、怀宁县委办主任刘劲松、怀宁县招商中心副主任余飞、怀宁县委办四级主任科员彭俊等领导一行莅临蓝海彤翔集团参观考察&#xff0c;集团总裁鲁永泉、集团CTO穆凯辉接待了考察团一行。 考察团…

UE4 AI群集实现

逻辑就不用说了&#xff0c;就是计算对应图形位置让每个Pawn移动到该位置 因为有时候AI与AI会卡住 所以加上这个Bool为true&#xff0c;以及设置两个AI之间至少隔的距离&#xff0c;设置在一个合理的参数即可 有时候AI群集&#xff0c;AI与AI会比较紧密&#xff0c;可以将Caps…

【完美世界】两男神一美女登场,石昊杀真神夺金果,战帝老天人出世,云曦参战

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析国漫资讯。 完美世界动画终于更新第134集预告了&#xff0c;虽然不是云曦特别篇的内容&#xff0c;但是画质与特效明显提升了&#xff0c;打斗也开始燃起来了。而且还登场三位新角色&#xff0c;两大男神&#xff0c;一位…

c语言练习90:反转链表

反转链表 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 与方法一相比方法二的思路更容易实现 报错原因&#xff1a;head和n3不能为空&#xff0c;为空则不能执行后面的操作 报错原因&#xff1a;listnode*n1,n2,n3; 纠正&#xff1a;listnode *n1…

杨帆 2022年 毕业论文相关 基于WS-DAN与时空注意力的学生课堂行为检测研究

杨帆&#xff1a; 毕业论文相关 下面是我公开的毕业论文全部相关文件&#xff1a; https://share.weiyun.com/UhFV67ds https://share.weiyun.com/9qOxwpqz 下面是我曾经公开在b站上的视频&#xff0c;因为我导师不建议公开&#xff0c;今年9月删除了&#xff0c;下面是视频源…

私域流量经营怎么做?私域流量转化功能推荐

流量在商业中扮演着至关重要的角色。无论是在线下还是线上&#xff0c;谁能更快地获取和利用流量&#xff0c;谁就能在激烈的市场竞争中占据优势。然而&#xff0c;流量的转化方式在传统和数字化营销系统中有着显著的差异。 数字化营销系统&#xff0c;如分销系统、拼团系统、分…

《机器学习----简单的分类器》第二章、朴素贝叶斯,项目:使用特征值给语句打标签

贝叶斯分类器 1,朴素贝叶斯算法1. 朴素贝叶斯算法、2. 算法思路3. 贝叶斯定理4.特征的选用的要求和处理 2&#xff0c;算法应用1 文本分类2 垃圾邮件过滤3 情感分析 3. 朴素贝叶斯的优缺点1. 优点2. 缺点 项目实践1&#xff0c;算法流程2&#xff0c;具体实现 1,朴素贝叶斯算法…

第二证券:什么股票属于创业板?

股票商场是一种杂乱的国际&#xff0c;不同类型的股票对应不同的生意商场。其间&#xff0c;创业板股票是一个备受关注的论题。那么&#xff0c;什么样的股票归于创业板呢&#xff1f;本文将从商场定义、股票分类以及出资关键点三个角度分析这个问题&#xff0c;帮忙读者全面了…

Vue3+ElementPlus el-date-picker时间选择器,设置最多选择60天区间内,必须选择大于今天

Vue3ElementPlus el-date-picker时间选择设置&#xff0c; 必须选择大于今天&#xff1b;最多选择60天区间内&#xff1b; 使用disabled-date&#xff1a; 具体实现代码&#xff1a; <el-date-pickerv-model"state.queryParams.dateTime":editable"false&q…

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-[4]客户端与服务端连接

红队专题 招募六边形战士队员服务端编写新建工程server函数创建主线程类获取配置信息运行command 命令头文件里创建引用win32 类库/头文件startsocket 开始监听 类函数添加类StartSocketmysend/myrecv 设置 m_sockCommon 头文件MSGINFO_S 结构体 ThreadMain头文件runflag 启动 …

RN:指定模拟器启动

背景 我们启动 react native 项目的时候&#xff0c;会打开一个模拟器&#xff0c;但是有时不是我们想要的&#xff0c;我们如何去指定一个模拟器启动呢&#xff1f; IOS xcrun simctl list devicesyarn ios --simulator"<模拟器的UDID>"Android 目前没发现…

量子力学应用的特殊函数1----谐振子场与线性场

量子力学应用的函数--谐振子 Hermite 函数 厄米函数的一些性质 Laguerre 函数 a不为零时&#xff0c;称之为广义拉盖尔函数&#xff0c;这里不去研究他的解的性质 拉盖尔函数的一些性质 /. AiryAi 函数 在脑海中补充他的边界条件通过傅里叶变换等一些列复杂的微操&#xff0c;…

VMware Workstation 15 安装教程

在本文中&#xff0c;我们将以VMware Workstation 15 为例&#xff0c;演示如何在Windows上安装VMware Workstation。首先&#xff0c;用户需要从VMware官网下载VMware Workstation 15 for Windows软件安装包。不知道如何下载的&#xff0c;小编也为大家准备了最新的分流下载地…

第三章 内存管理 八、两级页表

目录 一、定义 二、如何实现地址变换 三、注意 四、总结 一、定义 二级页表是一种分层的虚拟内存管理机制。在二级页表中&#xff0c;虚拟地址被分成两个层次&#xff0c;第一层是页目录&#xff0c;第二层是页表。通过这种方式&#xff0c;二级页表可以管理更大的虚拟内存…

比亚迪、吉利、蔚来等将出席2023第四届中国新能源汽车热管理峰会

会议背景 2023第四届中国新能源汽车热管理创新国际峰会将于11月16日-17日在上海举办。会议线上线下同步举行&#xff0c;会场提供中英同声传译。 本次峰会将密切关注“双碳”目标下中国新能源汽车一体化热管理的最新行业动态与关键技术的研发和应用方案。会议将对中国新能源汽…

伦敦银怎么算自己的收益?

伦敦银国际贵金属投资市场上的高收益的投资工具&#xff0c;目前投资者在香港的平台参与交易&#xff0c;可以获得50倍的资金杠杆&#xff0c;因此只有拿下一小波的行情&#xff0c;就有望赚取一波爆发性的收益。 但伦敦银交易中的收益具体是如何计算的呢&#xff1f;假设投资者…