给定循环单调非递减列表中的一个点,写一个函数向这个列表中插入一个新元素 insertVal ,使这个列表仍然是循环升序的。给定的可以是这个列表中任意一个顶点的指针,并不一定是这个列表中最小元素的指针。如果有多个满足条件的插入位置,可以选择任意一个位置插入新的值,插入后整个列表仍然保持有序。如果列表为空(给定的节点是 null),需要创建一个循环有序列表并返回这个节点。否则。请返回原先给定的节点。
链接:力扣
思路:
- 首先是有一个LeetCode给出的Node结构数据,存放当前值和下个节点
class Node { public int val; public Node next; public Node() { } public Node(int _val) { val = _val; } public Node(int _val, Node _next) { val = _val; next = _next; } };
可能出现的情况
- 如果当前Node没有值,这新增一个Node即可,
- 如果当前Node只有一个值,则在这个Node后面新增一个Node即可
- 如果有多个值,插入的值肯定在两值之间,可能出现的情况,则可以拿出当前值和下一值与即将插入值做比较
1、如当前值<下一个值,如果插进来的值在两个值之间,则在当前值后面插入
2、如当前值>下一值,则需要判断插入值>当前值,或插入值<下一值(可以理解为需要插入到表头或表尾)
实现:
public Node insert(Node head, int insertVal) { Node node = new Node(insertVal); if (head == null) { node.next = node; return node; } if (head.next == null) { head.next = node; node.next = head; return head; } Node curr = head; Node nextNode = head.next; while (head != nextNode) { if (curr.val <= insertVal && nextNode.val >= insertVal) { break; } //curr > next,如果需要放在curr和next之间,则需要 insert>curr 或insert < next 才能保持有序 //可以理解为当前值已经到了末尾 if (curr.val > nextNode.val) { if (insertVal >= curr.val || insertVal <= nextNode.val) { break; } } curr = curr.next; nextNode = nextNode.next; } node.next = nextNode; curr.next = node; return head; }