剑指offer(二十五):复杂链表的复制

刷题平台:牛客网

题目描述

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
 
思路:
1.复制结点,将其插入到原结点的后面
2.还原新节点的random指针
3.拆分为两个链表
刚开始没太明白题目的意思,其实就是,重新申请结点创建一个与之前链表一模一样的链表,难点在于random链的复制。
遇到的问题:首先是不能返回参数pHead;其次在进行random还原的时候要进行判空处理,否则会空指针异常;最后,要将前后链表均恢复
 
C++实现:
class Solution {
public:
    RandomListNode* Clone(RandomListNode* pHead)
    {
        if(!pHead) return NULL;
        RandomListNode * p = pHead;
        
        //1.复制结点,将其插入到原结点的后面
        while(p){
            RandomListNode * s = new RandomListNode(p->label);
            s->next = p->next;
            p->next = s;
            p = s->next;
        }
     //2.还原新节点的random指针 p
= pHead; while(p){ if(p->random) p->next->random = p->random->next; p = p->next->next; }
     3.拆分为两个链表 RandomListNode
*pCloneHead = pHead->next; RandomListNode *tmp; p = pHead; while(p->next){ tmp = p->next; p->next = tmp->next; p = tmp; } return pCloneHead; } };

 

java实现:

public class Solution {
    public RandomListNode Clone(RandomListNode pHead)
    {
        if(pHead == null) return null;
        RandomListNode p = pHead;
        while(p != null){
            RandomListNode newNode = new RandomListNode(p.label);
            newNode.next = p.next;
            p.next = newNode;
            p = newNode.next;
        }
        p = pHead;
        while(p != null){
            if(p.random != null){
                p.next.random = p.random.next;
            }
            p = p.next.next;
        }
        p = pHead;
        RandomListNode q;
        RandomListNode copyHead = pHead.next;
        while(p.next != null){
            q = p.next;
            p.next = q.next;
            p = q;
        }
        return copyHead;
    }
}

原文地址:https://www.cnblogs.com/ttzz/p/13303703.html