【题目】:
一种特殊的链表节点类描述如下:
struct RandomListNode
{
int label;
struct RandomListNode *next, *random;
RandomListNode(int x) :
label(x), next(NULL), random(NULL) {}
};
RandomListNode类中的label是节点值,next指针和正常的单链表指针中的next指针的意义一样,都指向下一个节点,random指针是RandomListNode类中的新增的指针,这个指针可能指向链表中的任意一个节点,也可能指向NULL。
给定一个由RandomListNode节点类型组成的五环单链表的头节点pHead,请实现一个函数完成这个链表中所有结构的复制,并返回复制的新链表的头节点。
【解答】:
1:普通解法
普通解法可以做到时间复杂度为O(N),空间复杂度为O(N)。
具体代码如下:
class Solution
{
public:
RandomListNode* Clone(RandomListNode* pHead)
{
if (pHead == NULL)
{
return NULL;
}
hash_map<RandomListNode*, RandomListNode*> hashNode;
RandomListNode* cur = pHead;
while (cur != NULL)
{
RandomListNode* temp = new RandomListNode(cur->label);
hashNode[cur] = temp;
cur = cur->next;
}
cur = pHead;
while (cur != NULL)
{
hashNode[cur]->next = hashNode[cur->next];
hashNode[cur]->random = hashNode[cur->random];
cur = cur->next;
}
return hashNode[pHead];
}
};
2:进阶解法
不使用额外的数据结构,只用有限的几个变量,且在时间复杂度为O(N)内完成。
具体代码如下:
RandomListNode* Clone(RandomListNode* pHead)
{
if (!pHead) return NULL;
RandomListNode *currNode = pHead;
while (currNode)
{
RandomListNode *node = new RandomListNode(currNode->label);
node->next = currNode->next;
currNode->next = node;
currNode = node->next;
}
currNode = pHead;
while (currNode)
{
RandomListNode *node = currNode->next;
if (currNode->random)
{
node->random = currNode->random->next;
}
currNode = node->next;
}
//拆分
RandomListNode *pCloneHead = pHead->next;
RandomListNode *tmp;
currNode = pHead;
while (currNode->next)
{
tmp = currNode->next;
currNode->next = tmp->next;
currNode = tmp;
}
return pCloneHead;
};
具体解答可以看左程云著《程序员代码面试指南》。