向有序的環形單鏈表中插入新節點(offer收割)

題目

一個環形單鏈表從頭節點head開始不降續,同時由最後的節點指回頭節點。給定這樣一個環形單鏈表的頭節點head和一個整數num,請生成節點值爲num的新節點,並插入到這個環形鏈表中,保證調整後的鏈表依然有序。node

說明

此題看起來很容易,但寫出簡潔無誤的代碼卻不容易。this

代碼

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+" ");
	}

}
複製代碼
相關文章
相關標籤/搜索