向有序的环形单链表中插入新节点(offer收割)

526 阅读1分钟

题目

一个环形单链表从头节点head开始不降续,同时由最后的节点指回头节点。给定这样一个环形单链表的头节点head和一个整数num,请生成节点值为num的新节点,并插入到这个环形链表中,保证调整后的链表依然有序。

说明

此题看起来很容易,但写出简洁无误的代码却不容易。

代码

package com.iqiyi;

import org.junit.Test;

public class Code2_18 {
	public static class Node{
		int data;
		Node next;
		Node(int data){
			this.data=data;
		}
	}
	
	public static Node insertNum(Node node,int num){
		Node temp=new Node(num);
		if(node==null){
			temp.next=temp;
			return temp;
		}
		Node pre=node;
		Node cur=node.next;
		while(cur!=node){
			if(pre.data<=num&&cur.data>=num)
				break;
			pre=pre.next;
			cur=cur.next;
		}
		pre.next=temp;
		temp.next=cur;
		return node.data<=num?node:temp;
	}
	
	@Test
	public void test1(){
		Node node0=new Node(1);
		Node node1=new Node(3);
		Node node2=new Node(5);
		Node node3=new Node(7);
		node0.next=node1;
		node1.next=node2;
		node2.next=node3;
		node3.next=node0;
		
		Node ans=insertNum(node0, 9);
		
		Node cur=ans;
		while(cur.next!=ans){
			System.out.print(cur.data+" ");
			cur=cur.next;
		}
		System.out.print(cur.data+" ");
	}
	
	@Test
	public void test2(){
		Node node0=new Node(1);
		Node node1=new Node(3);
		Node node2=new Node(5);
		Node node3=new Node(7);
		node0.next=node1;
		node1.next=node2;
		node2.next=node3;
		node3.next=node0;
		
		Node ans=insertNum(node0, 0);
		
		Node cur=ans;
		while(cur.next!=ans){
			System.out.print(cur.data+" ");
			cur=cur.next;
		}
		System.out.print(cur.data+" ");
	}
	
	@Test
	public void test3(){
		Node node0=new Node(1);
		Node node1=new Node(3);
		Node node2=new Node(5);
		Node node3=new Node(7);
		node0.next=node1;
		node1.next=node2;
		node2.next=node3;
		node3.next=node0;
		
		Node ans=insertNum(node0, 1);
		
		Node cur=ans;
		while(cur.next!=ans){
			System.out.print(cur.data+" ");
			cur=cur.next;
		}
		System.out.print(cur.data+" ");
	}

}