思路
本题有三个关键点
- 如何遍历循环链表? 设置一个哨兵,当遍历的结点再次遇到哨兵时说明已经全部遍历一次了
- 如何寻找插入位置? 插入只有两种情况,要么作为中间值插入,比如3插入2、4、5中,要么作为边界结点插入,如果1或6插入2、4、5中,对于边界值插入的情况,只需要找到值最大的结点,插入到他后方即可
- 在寻找最大值结点的过程中,注意是>=,这样确保在有多个最大值的情况下,也能找到最后一个结点
class Solution {
public Node insert(Node head, int insertVal) {
Node insertNode = new Node(insertVal);
if (null == head) {
head = insertNode;
head.next = head;
} else {
Node pre = head, next = head.next, biggestNode = head;
//判断需要插的值会不会破坏改变边界
while (next != head) {
if (next.val >= biggestNode.val)
biggestNode = next;
//是中间值 在此插入
if (pre.val <= insertVal && next.val >= insertVal) {
pre.next = insertNode;
insertNode.next = next;
return head;
} else {
pre = next;
next = next.next;
}
}
if (pre.val <= insertVal && next.val >= insertVal) {
pre.next = insertNode;
insertNode.next = next;
}
else {
insertNode.next = biggestNode.next;
biggestNode.next = insertNode;
}
}
return head;
}
}
Go代码
func insert(aNode *Node, x int) *Node {
if aNode == nil {
node := &Node{
Val: x,
Next: nil,
}
node.Next = node
return node
}
if aNode.Next == nil {
aNode.Next = &Node{
Val: x,
Next: aNode,
}
return aNode
}
if aNode.Val <= x && aNode.Next.Val >= x {
aNode.Next = &Node{
Val: x,
Next: aNode.Next,
}
return aNode
}
node, maxNode := aNode.Next, aNode
for ; node != aNode; node = node.Next {
if node.Val <= x && node.Next.Val >= x {
node.Next = &Node{
Val: x,
Next: node.Next,
}
return aNode
}
if node.Val >= maxNode.Val {
maxNode = node
}
}
maxNode.Next = &Node{
Val: x,
Next: maxNode.Next,
}
return aNode
}