有一个整数val,如何在节点值有序的环形链表中插入一个节点值为val的节点,并且保证这个环形单链表依然有序。
给定链表的信息,及元素的值A及对应的nxt指向的元素编号同时给定val,请构造出这个环形链表,并插入该值,并打印出插入后的环形链表。
注:最后打印链表是将链表的节点值转换为数组,并且多打印了一次头节点
/**
* 节点
*/
class ListNode {
int val;//当前节点值
ListNode next = null;//下一个节点
ListNode(int val) {
this.val = val;
}
}
/**
* A为链表的节点值,nxt为链表节点值对应在数组A中的位置
*/
public class InsertValue {
public int[] insert(int[] A, int[] nxt, int val) {
//先把要插入的结点创建出来,为node
ListNode node = new ListNode(val);
//考虑特殊的空输入直接返回插入的结点
if(A==null||A.length<=0){
int[] curNode={node.val};
return curNode;
}
//用head记住链表的头结点
ListNode head=new ListNode(A[0]);
//用一个变量tmp代表链表,方便对其进行遍历,先指向头节点
ListNode tmp=head;
//将数组A中的元素创建成结点并组成一个循环链表
for(int i=0;i<A.length-1;i++){
ListNode newNode= new ListNode(A[nxt[i]]);
tmp.next=newNode;
tmp=newNode;
}
//循环结束后将尾节点指向头节点
tmp.next=head;
//下面是插入节点的操作
//如果val是最小的结点那么直接插入到head的前面
if(val<head.val){
tmp.next=node;
node.next=head;
}
//如果val不是最小的结点,那么val应该插入到某两个结点之间
//使用pre、cur两个指针来进行遍历寻找合适的位置
ListNode pre=head;
ListNode cur=pre.next;
while(cur!=head){//还没有遍历至最后一个节点
if(pre.val<=val&&val<=cur.val)
//表示val找到合适的位置
break;
//否则继续向下移动遍历
pre=cur;
cur=cur.next;
}
//如果cur为头节点,表示val是最大值,应当插入到最后一个结点的后面
node.next=cur;
pre.next=node;
//将插入后的链表节点值存储到数组中
ListNode nodeItem=head;
int[] nodeValue=new int[A.length+2];//插入一个元素并且要将头结点也打印出来
int index=0;
while(nodeItem.next!=null && index<A.length+2){//只打印一遍完整的链表和一个头节点
nodeValue[index]=nodeItem.val;
index++;
nodeItem=nodeItem.next;
}
return nodeValue;
}
//测试样例
public static void main(String[] args){
InsertValue value=new InsertValue();
int A[]={1,3,4,5,7};
int nxt[]={1,2,3,4};
int[] nodeValue=value.insert(A,nxt,6);
for(int i=0;i<nodeValue.length;i++) {
System.out.println(nodeValue[i]);
}
}
}