一、题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
二、输入描述
输入一个复杂链表
三、输出描述
返回复制复杂链表
四、牛客网提供的框架
/*
struct RandomListNode {
int label;
struct RandomListNode *next, *random;
RandomListNode(int x) :
label(x), next(NULL), random(NULL) {
}
};
*/
class Solution {
public:
RandomListNode* Clone(RandomListNode* pHead)
{
}
};
五、解题思路
分两步处理:
1、先复制单链表的指针与节点(next)
2、处理random指针。根据第一步得出来的链表,逐个求出每个节点的random指向的位置。
六、代码
class Solution {
public:
RandomListNode* Clone(RandomListNode* pHead)
{
RandomListNode* newHead; //新链表头结点
if(!pHead) return NULL;
newHead = new RandomListNode(pHead->label); //新建头结点
RandomListNode* newCurrNode; //辅助拷贝next指向的节点
newCurrNode = newHead;
/*
* 复制next指针的链表
*/
RandomListNode* oldNextNode;
oldNextNode = pHead->next;
while(oldNextNode)
{
RandomListNode* temp = new RandomListNode(oldNextNode->label);
newCurrNode->next = temp;
newCurrNode = newCurrNode->next;
oldNextNode = oldNextNode->next;
}
/*
*复制random指针
*从链头开始,逐个找出每个节点random指针指向的节点位置。
*/
RandomListNode* oldCurrNode;
oldCurrNode = pHead;
RandomListNode* newRandomCurrNode;
newRandomCurrNode = newHead;
while(oldCurrNode) //逐个节点处理
{
int index = 0;
RandomListNode* randomNode = oldCurrNode->random; //节点oldCurrNode的random指针指向的节点
RandomListNode* findeRandom = pHead;
while(findeRandom != randomNode) //找出oldCurrNode的random指针指向节点在链表中的下表
{
findeRandom = findeRandom->next;
index++;
}
RandomListNode* newRandomNode;
newRandomNode = newHead;
while(index > 0) //对复制后的链表,找出节点newRandomCurrNode的random指针指向节点的位置。
{
newRandomNode = newRandomNode->next;
index--;
}
newRandomCurrNode->random = newRandomNode;
oldCurrNode = oldCurrNode->next;
newRandomCurrNode = newRandomCurrNode->next;
}
return newHead;
}
};