复制含有随机指针节点的链表——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;
};
具体解答可以看左程云著《程序员代码面试指南》。
一种特殊的链表节点类描述如下:
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;
};
具体解答可以看左程云著《程序员代码面试指南》。
相关文章推荐
- 一个链表的每个节点,有一个指向next指针指向下一个节点,还有一个rand指针指向这个链表中的一个随机节点或NULL,现在要求复制一个单链表来实现这个链表,返回复制后的新链表。
- 复制含有随机指针节点的链表
- 复制含有随机指针节点的链表
- 复杂链表的复制(复制含有随机指针节点的链表)
- 复制含有随机指针节点的链表
- 链表问题---复制含有随机指针节点的链表
- 链表问题——复制含有随机指针节点的链表
- 如何复制一个含有随机指针节点的链表
- 【LeetCode-面试算法经典-Java实现】【143-Copy List with Random Pointer(有随机指针的链表复制)】
- LeetCode OJ 之 Copy List with Random Pointer(复制含有随机指针的链表)
- 算法系列之-复制含有随机指针的链表
- O(1)时间复杂度删除链表节点/复制带随机指针的链表
- 复制含有随机指针的链表
- java实现输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head
- 链表含有随机rand指针的复制
- 复制含有随机节点的链表
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。
- 【C++】模板实现带头节点的双向循环链表
- [面试] - 在单链表末尾添加一个节点 C++ 实现
- 一个链表问题:复制带随机指针的链表