2022-8-1 剑指offer-链表-模拟

剑指 Offer II 029. 排序的循环链表

难度中等

给定循环单调非递减列表中的一个点,写一个函数向这个列表中插入一个新元素 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 }

思路:除了需要判断插入的值可能为最大也可能为最小之外,因为是循环链表还要额外判断链表绕圈的情况。

posted on 2022-08-01 16:11  阿ming  阅读(16)  评论(0编辑  收藏  举报

导航