算法总结之 向有序的环形单链表中插入新节点
题目: 一个环形链表从表头节点head开始不降序,同时由最后的节点指回头节点。给定这样一个环形单链表的头节点和一个整数num,请生成节点值为num的新节点,并插入到这个环形链表中,保证调整后的链表依然有序
时间复杂度O(N) 额外空间复杂度O(1) 的方法
1 生成节点的值为num的新节点, 记为node
2 如果链表为空 让node自己组成环形链表,然后直接返回node
3如果链表不为空,令变量 pre=head, cur=head.next, 然后让他俩同步移动下去,如果遇到pre的节点小于或者等于num,并且cur的值大于或等于num 说明node应该在pre节点和cur之间插入 然后返回head即可
4 如果pre和cur转了一圈,没有发现上面所述的情况。则node应该插入到头节点前面,这种情况之所以会发生,要么是因为node节点的值比链表的每个值都大,要么是都小
5 如果打,返回原来头节点即可,如果都小,把node作为链表的头节点返回即可
请参考代码:
package TT; public class Test113 { public class Node{ public int value; public Node next; public Node(int data){ this.value=data; } } public Node insertNum(Node head, int num){ Node node = new Node(num); if(head==null){ node.next=node; return node; } Node pre = head; Node cur = head.next; while(cur!=head){ if(pre.value <= num && cur.value>=num){ break; } pre=cur; cur=cur.next; } pre.next=node; node.next=cur; return head.value <num ? head:node; } }