剑指offer-复杂链表的复制

本文详细解析了复杂链表的复制方法,通过两次遍历来分别处理Next和Random指针,确保复制链表与原链表结构一致且节点独立。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题

题目:[剑指offer-复杂链表的复制]

思路

先说一个观点,在你实在不想看的时候,可以看了别人的方法,记住就行。总比什么都不想好。
但是,如果自己要是写的化,一定要自己想。

不见得能直接想出最好的方法,但是,必须得有思路,复杂的方法还是要把它实现了。其实这也是对编程能力最直观的体现,处理复杂逻辑的能力。

这个题目,正常的思路也很容易想。
总共两次遍历,第一次遍历复制链表Next指针域即可。
第二次遍历的时候,对于原来的链表,每一个节点的random记住它和头节点的偏移,然后在克隆链表里面,对于每一个节点的random让它从头节点走上面的offset即可。

代码

/*
struct RandomListNode {
    int label;
    struct RandomListNode *next, *random;
    RandomListNode(int x) :
            label(x), next(NULL), random(NULL) {
    }
};
*/
class Solution {
public:
    RandomListNode* Clone(RandomListNode* pHead)
    {
        if(!pHead) return NULL;
        typedef RandomListNode Node;

        Node* head = NULL;
        Node* p = pHead;
        Node* cur = NULL;

        // just copy the list
        while( p ){
            Node* s = new Node(p->label);
            if(!head){
                head = s;
            }else{
                cur->next = s;
            }
            cur = s;
            p = p->next;
        }

        // set the random pointer
        p = pHead;
        Node* q = head;
        while(p){

            // compute the offset
            Node* prand = p->random;
            int step = 0;
            Node* tmp = pHead;
            while(tmp != prand){
                ++step;
                tmp = tmp->next;
            }

            // set the random pointer
            Node* q_rand = head;
            while(step--) q_rand = q_rand->next;
            q->random = q_rand;

            p = p->next;
            q = q->next;
        }
        return head;

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值