算法总结之 向有序的环形单链表中插入新节点

题目: 一个环形链表从表头节点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;
        
    }
    
    
    
    
    
    
}

 

posted @ 2017-09-11 17:01  toov5  阅读(695)  评论(0编辑  收藏  举报