面试题26_带随机指针的链表复制
2015-07-28 20:31
323 查看
题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。解题思路
思路一:分两步:第一步,遍历一遍链表,挨个复制;O(n)
第二步,遍历链表,挨个找随机指针,因为定位随机指针要从头开始,所以每一个节点的随机指针都要从头开始找;时间复杂度是:O(n^2)
总时间复杂度:O(n^2)
思路二:
分三步:
第一步:挨个复制,链接在原节点后面,例如:1->2->3->4,复制后:1->1->2->2->3->3->4->4。时间复杂度O(n)
第二步:挨个复制随机指针,将随机指针的指向设置好。时间复杂度O(n)
第三步:拆分成两个链表,注意编码细节 。时间复杂度O(n)
总时间复杂度:O(n)+O(n)+O(n) == O(n)
代码实现
/* struct RandomListNode { int label; struct RandomListNode *next, *random; RandomListNode(int x) : label(x), next(NULL), random(NULL) { } }; */ class Solution { public: RandomListNode* Clone(RandomListNode* pHead) { if(pHead == nullptr) return nullptr; CloneNodes(pHead); ConnectRandomList(pHead); return DeconnectList(pHead); } //第一步复制节点 void CloneNodes(RandomListNode* pHead) { RandomListNode *pNode = pHead; while(pNode != nullptr) { RandomListNode *pClone = new RandomListNode(0); pClone->label = pNode->label; pClone->next = pNode->next; pClone->random = nullptr; pNode->next = pClone; pNode = pClone->next; } } //第二步复制随机指针 void ConnectRandomList(RandomListNode *pHead) { RandomListNode *pNode = pHead; while(pNode != nullptr) { RandomListNode *pClone = pNode->next; if(pNode->random != nullptr) { pClone->random = pNode->random->next; } pNode = pClone->next; } } //第三步拆分链表 RandomListNode* DeconnectList(RandomListNode *pHead) { RandomListNode *pNode = pHead; RandomListNode *pCloneHead = nullptr; RandomListNode *pCloneNode = nullptr; if(pNode != nullptr) { pCloneHead = pNode->next; pCloneNode = pNode->next; pNode->next = pCloneNode->next; pNode = pCloneNode->next; } //注意指针的指向 及 顺序 while(pNode != nullptr) { pCloneNode->next = pNode->next; pCloneNode = pCloneNode->next; pNode->next = pCloneNode->next; pNode = pNode->next; } return pCloneHead; } };
相关文章推荐
- 【面试加分项】java异常处理之try_catch_finally
- 每个程序员需掌握的20个代码命名小贴士
- 黑马程序员——泛型
- 黑马程序员——集合(二)
- 黑马程序员---函数的相关知识
- 黑马程序员——Java基础 数组排序的两种实现方法,选择和冒泡
- Android面试题(含答案)
- 面试题
- 年轻程序员需要学习的5大经验
- (4.4.9)android最全面试题71道题 详解
- 程序员分类(转)
- 剑指Offer面试题8(java版):旋转数组的最小数字
- (4.4.8)Android常见笔试面试题
- 黑马程序员——Java基础---多线程
- 前端开发常见的面试问题
- 黑马程序员----java基础--常量变量运算符总结
- 黑马程序员——Java基础——IO(一)
- 大数据量的算法面试题
- (剑指Offer)面试题42:左旋转字符串
- 【剑指Offer面试题】 九度OJ1513:二进制中1的个数