刷题平台:牛客网
题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针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; } }