给定一个链表,链表的每一个节点包含三个属性:1、节点值;2、指向下一个结点的引用;3、随机指向链表内任意一个节点的引用,也能不指向任何节点。复制该链表

本文介绍了一种解决复杂链表复制问题的算法。算法通过创建新的链表并结合原链表,利用节点间的相对关系复制随机指针,最后拆分链表得到目标复制链表。
摘要由CSDN通过智能技术生成
思路:这个算法的难点就难在链表有一个指向随机节点的引用,你不能确定这个引用指向哪一个节点,但是我们可以用选择参照的方式,来解决问题。用原链表作为参照物,head为原链表的某一节点,这个节点的next本来是指向下一个节点的,但是 现在,我们可以把这个next指向复制链表相对于原链表的相应节点headClone,然后再把headClone的next指向head的next,依次类推,到这里已经可以看出规律了,这个融合了原链表和复制链表的新链表的有一个特征,前后两个节点为原节点和复制节点的关系,这样的话,原节点的的随机节点引用指向的节点的next节点就是复制节点的随机节点引用该指向的节点,之后再将两个链表拆开,得到的其中一个链表就是我们需要的复制链表,代码如下:
/*
public class RandomListNode {
    int label;
    RandomListNode next = null;
    RandomListNode random = null;

    RandomListNode(int label) {
        this.label = label;
    }
}
*/
public class Solution {
    public RandomListNode Clone(RandomListNode pHead){
        if(pHead==null){
            return null;
        }
        
        RandomListNode tempNode;
        RandomListNode pHeadClone;     
        RandomListNode newHeadClone;
        RandomListNode newHead = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值