要求:给定循环单调非递减列表中的一个点,写一个函数向这个列表中插入一个新元素 insertVal ,使这个列表仍然是循环升序的。
测试样例:
输入:head=【3,4,1】,insertVal:2
输出:【3】
图1 测试样例1
题解:
找到循环链表的最大节点,即尾节点;
尾巴节点的下一个节点为头结点,即最小节点;
将尾巴节点与头节点断开,变成单链表;
执行单链表的插入操作,最后将头尾节点再相连。
代码:
class Solution {
public Node insert(Node head, int insertVal) {
// 特殊样例,head为null
if(head == null){
Node res = new Node(insertVal);
res.next = res;
return res;
}
// 找到最大节点
int maxValue = head.val;
Node maxNode = head;
Node temp = head;
temp = temp.next;
while (temp != head) {
if(temp.val >= maxValue){
maxValue = temp.val;
maxNode = temp;
}
temp = temp.next;
}
// 最大节点即为尾节点
Node tail = maxNode;
// 尾节点的下一个节点为头结点
Node dummy = new Node();
dummy.next = tail.next;
// 断开首尾节点,变成单链表
tail.next = null;
// 执行单链表的有序插入操作
Node pre = dummy;
Node p = dummy.next;
if (insertVal <= p.val){
Node insertNode = new Node(insertVal);
insertNode.next = dummy.next;
dummy.next = insertNode;
tail.next = dummy.next;
return head;
}
while (p != null && p.val < insertVal){
pre = pre.next;
p = p.next;
}
Node insertNode = new Node(insertVal);
if(p == null){
insertNode.next = null;
pre.next = insertNode;
tail = insertNode;
} else {
insertNode.next = p;
pre.next = insertNode;
}
// 操作完首尾相连
tail.next = dummy.next;
// 返回原始头结点
return head;
}
}