环形链表的插值

有一个整数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]);
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值