您的位置:首页 > 编程语言 > C语言/C++

复制含有随机指针节点的链表——C++实现

2017-10-09 09:57 549 查看
【题目】:

       一种特殊的链表节点类描述如下:

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;
};

具体解答可以看左程云著《程序员代码面试指南》。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 算法 visual studio
相关文章推荐