复制带有随机指针的链表

1.问题描述
指的是一个链表除了有next引用之外,还存在一个引用随机指向一个链表的结点。
2.问题分析:
第一步:为了能够更好地把原链表的随机指针复制过去,应该把链表复制为以下样子:
1 -->1–>2–>2–>3–>3–>4–>4
第二步:复制原链表的随机值 。
第三步:把列表恢复为两个链表,并且返回复制之后链表得头结点。

class Solution {
    public Node copyRandomList(Node head) {
        if(head==null)
        {
            return null;
        }
        Node p1=head;
        while(p1!=null)
        {
            Node p2=new Node(p1.val);
            p2.next=p1.next;
            p1.next=p2;
            p1=p2.next;
        }     //第一步
       
        p1=head;
        while(p1!=null)
        {
           Node p2=p1.next;
            if(p1.random!=null)
            {
            p2.random=p1.random.next;   // 这一步很关键,这样子就通过原链表把原链表的随机指针复制给新链表
            }
            p1=p2.next;
        }    //  第二步
        p1=head;
        Node newHead=head.next;
        while(p1!=null)
        {
            Node p2=p1.next;
            p1.next=p2.next;
            if(p2!=null)
            {
                if(p2.next!=null)
                {
            p2.next=p2.next.next;
                }
            }
            p1=p1.next;
        }
        return newHead;      //第三步
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值