我们常用的链表基本都是单链表和双向链表,两种链表不同在于双向链表比单链表多了一个指向当前节点的前一个节点的指针域。
而复杂链表,相比单链表多了一个指向任意位置的随机域。复杂链表的结构如下:
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;
}