向有序环形单链表中插入新节点
向有序环形单链表中插入新节点
问题重述:
一个有序的环形单链表,从头节点开始升序,同时由最后一个结点指回头节点,给定一个环形链表的头节点和一个数值num,创建一个数值为num的新节点,将该节点插入到环形单链表中,要求链表始终有序
问题分析:
这道题就是简单的遍历环形单链表,然后插入新节点,只需要考虑一些特殊情况即可
链表为空:新节点成环返回
链表正常,且新节点插在中间:正常插入
链表正常,但新节点的值会影响链表的有序:将新节点插在最后一个结点和头节点的中间(这里需要注意返回的头节点需要看头节点的值和新节点谁的值小,谁的值小谁作为head返回)
解法:
链表的遍历
解题:
代码:
public static Node insertNum(Node head,int num) {
Node newNode = new Node(num);
if(head == null) {
newNode.next = newNode;
return newNode;
}
Node pre = head;
Node cur = head.next;
while(cur != head) {
if(pre.value <= num && cur.value >= num) {
// 当前值处于pre和cur之间,插入
newNode.next = cur;
pre.next = newNode;
break;
}
// 更新pre和cur
pre = pre.next;
cur = cur.next;
}
if(cur == head) {
newNode.next = cur;
pre.next = newNode;
}
return head.value > num ? newNode : head;
}
代码解析:就是对环形单链表的特殊情况进行处理,当链表为空,新节点成环返回。不为空就循环链表,当循环过程中有满足条件的位置,就将新节点插入该位置,如果循环到头节点都不满足,则将新节点插入到头节点之前。最后对新节点和头节点进行比较,返回值较小的哪一个。
总结:
当题目要求我们对链表进行插入、删除等操作的时候,我们一般都会用到当前结点的前一个结点,所以我们一般创建一个新节点来保存当前节点的前一个结点。有时候也会保存当前节点的下一个结点
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律