链表面试题之复杂链表的复制
2017-07-23 15:05
267 查看
我们常用的链表基本都是单链表和双向链表,两种链表不同在于双向链表比单链表多了一个指向当前节点的前一个节点的指针域。
而复杂链表,相比单链表多了一个指向任意位置的随机域。复杂链表的结构如下:
因为多了一个随机域指针,所以导致了复制该链表时因为随机域的难以控制而使复制过程变得复杂。
下面就来看看复杂链表的复制
假设有这样一个复杂链表
首先,我们在每一个节点的后面插入一个新节点,每一个新节点的值与前一个节点的值相同。
然后,让每一个新节点的随机域指向与每一个对应位置上的旧节点的随机域指向相同。
即拷贝一份新的复杂链表
拷贝成功之后,再把新的链表拆分出来。
由此,复杂链表的复制完成。
代码如下
而复杂链表,相比单链表多了一个指向任意位置的随机域。复杂链表的结构如下:
struct ComplexNode { int _data; ComplexNode* _next; ComplexNode* _random; ComplexNode(int data) : _data(data) , _next(NULL) , _random(NULL) {} };
因为多了一个随机域指针,所以导致了复制该链表时因为随机域的难以控制而使复制过程变得复杂。
下面就来看看复杂链表的复制
假设有这样一个复杂链表
首先,我们在每一个节点的后面插入一个新节点,每一个新节点的值与前一个节点的值相同。
然后,让每一个新节点的随机域指向与每一个对应位置上的旧节点的随机域指向相同。
即拷贝一份新的复杂链表
拷贝成功之后,再把新的链表拆分出来。
由此,复杂链表的复制完成。
代码如下
// 复杂链表的复制 ComplexNode* CopyComplexNode(ComplexNode* pHead) { if (pHead == NULL) { return NULL; } ComplexNode* pCur = pHead; // 在每一个节点后插入新节点——>拷贝节点并连接 ComplexNode* NewNode = NULL; while (pCur) { NewNode = new ComplexNode(pCur->_data); NewNode->_next = pCur->_next; pCur->_next = NewNode; pCur = NewNode->_next; } // 链接随机指针域 pCur = pHead; while (pCur) { if (pCur->_random) pCur->_next->_random = pCur->_random->_next; else pCur->_next->_random = NULL; pCur = pCur->_next->_next; } // 拆分节点 NewNode = pHead->_next; ComplexNode* Tail = NewNode; pHead->_next = NewNode->_next; pCur = pHead->_next; while (pCur) { ComplexNode* pNext = pCur->_next; pCur->_next = pNext->_next; Tail->_next = pNext; Tail = pNext; pCur = pCur->_next; } return NewNode; }
相关文章推荐
- 面试题26:复杂链表的复制
- 剑指offer面试题26-复杂链表的复制
- 面试题26 复杂链表的复制
- 面试题26:复杂链表的复制
- 程序员面试题精选---复杂链表的复制
- 剑指offer——面试题26:复杂链表的复制
- 【剑指offer】4.4分解让复杂问题简单化——面试题26:复杂链表的复制
- 剑指offer-面试题26-复杂链表的复制
- 剑指offer面试题26之复杂链表的复制问题
- 剑指offer之面试题26 复杂链表的复制 之 链表插入删除结点不断链不覆盖
- 面试题26 复杂链表的复制
- [剑指offer][面试题26]复杂链表的复制
- 链表面试题之复杂链表的复制
- 【面试题026】复杂链表的复制
- 面试题26.复杂链表的复制
- 面试题26. 复杂链表的复制
- 剑指offer面试题[26]-复杂链表的复制
- 程序员面试题精选100题(49)-复杂链表的复制
- 面试题26:复杂链表的复制
- 《剑指offer》面试题26:复杂链表的复制