2022-8-1 剑指offer-链表-模拟
给定循环单调非递减列表中的一个点,写一个函数向这个列表中插入一个新元素 insertVal
,使这个列表仍然是循环升序的。
给定的可以是这个列表中任意一个顶点的指针,并不一定是这个列表中最小元素的指针。
如果有多个满足条件的插入位置,可以选择任意一个位置插入新的值,插入后整个列表仍然保持有序。
如果列表为空(给定的节点是 null
),需要创建一个循环有序列表并返回这个节点。否则。请返回原先给定的节点。
1 /* 2 // Definition for a Node. 3 class Node { 4 public int val; 5 public Node next; 6 7 public Node() {} 8 9 public Node(int _val) { 10 val = _val; 11 } 12 13 public Node(int _val, Node _next) { 14 val = _val; 15 next = _next; 16 } 17 }; 18 */ 19 20 class Solution { 21 public Node insert(Node head, int insertVal) { 22 if (head==null){ 23 Node node=new Node(insertVal); 24 node.next=node; 25 return node; 26 } 27 Node temp=head; 28 if (temp.val>insertVal){ 29 while (temp.next.val>=temp.val) { 30 temp=temp.next; 31 //需要防止绕圈 32 if (temp==head) break; 33 } 34 35 } 36 // 到达链表最大值处 37 // 如果插入的比第一个还小 38 // 特殊判断 39 if (temp.next.val>insertVal){ 40 Node node=new Node(insertVal); 41 node.next=temp.next; 42 temp.next=node; 43 return head; 44 } 45 temp=temp.next; 46 Node p=temp; 47 //需要防止绕圈 48 while (temp.next.val<insertVal&&temp.next.val>=temp.val){ 49 temp=temp.next; 50 if (temp==p) break; 51 } 52 // 如果temp到达最大值了判断是否是插入的最大值 53 // 直接添加 54 Node node=new Node(insertVal); 55 node.next=temp.next; 56 temp.next=node; 57 return head; 58 } 59 }
思路:除了需要判断插入的值可能为最大也可能为最小之外,因为是循环链表还要额外判断链表绕圈的情况。