输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
思路: 1.先根据next复制整个链表.2.根据random指针在原始链表的位置找出random在复制的链表中对应的位置, 并建立关联.
struct RandomListNode {
int label;
struct RandomListNode *next, *random;
RandomListNode(int x) :
label(x), next(NULL), random(NULL) {
}
};
class Solution {
public:
RandomListNode* Clone(RandomListNode* pHead)
{
RandomListNode* head = NULL;
do
{
if (NULL == pHead) {
break;
}
head = new RandomListNode(pHead->label);
RandomListNode* sourceHead = pHead;
RandomListNode* targetHead = head;
// 复制next
while (NULL != sourceHead && NULL != sourceHead->next) {
targetHead->next = new RandomListNode(sourceHead->next->label);
targetHead = targetHead->next;
sourceHead = sourceHead->next;
}
sourceHead = pHead;
targetHead = head;
// 复制random
while (NULL != sourceHead) {
if (NULL == sourceHead->random) {
targetHead->random = NULL;
sourceHead = sourceHead->next;
targetHead = targetHead->next;
continue;
}
RandomListNode* random = sourceHead->random;
RandomListNode* searchStart = pHead;
RandomListNode* node = head;
while (searchStart != NULL && node !=NULL) {
if (random == searchStart) {
// 根据random在pHead中的位置 得到random在head中对应的位置
break;
}
searchStart = searchStart->next;
node = node->next;
}
targetHead->random = node;
sourceHead = sourceHead->next;
targetHead = targetHead->next;
}
} while (0);
return head;
}
};
测试