逐个复制节点,cloned节点在源节点之后,形如A A B B C C; 针对cloned节点,设置其random指针; 将长链表拆分成两个链表。
struct RandomListNode {
int label;
struct RandomListNode * next, * random;
RandomListNode ( int x) :
label ( x) , next ( NULL ) , random ( NULL ) {
}
} ;
class Solution {
public :
void CloneNodes ( RandomListNode* pHead) {
RandomListNode* pNode = pHead;
while ( pNode != NULL ) {
RandomListNode* clone = new RandomListNode ( 0 ) ;
clone- > label = pNode- > label;
clone- > next = pNode- > next;
pNode- > next = clone;
pNode = clone- > next;
}
}
void ConnectRandomNodes ( RandomListNode* pHead) {
RandomListNode* pNode = pHead;
while ( pNode != NULL ) {
RandomListNode* pCloned = pNode- > next;
if ( pNode- > random != NULL ) {
pCloned- > random = pNode- > random- > next;
}
pNode = pCloned- > next;
}
}
RandomListNode* ReconnectNodes ( RandomListNode* pHead) {
RandomListNode* pNode = pHead;
RandomListNode* pClonedHead = NULL ;
RandomListNode* pClonedNode = NULL ;
if ( pNode != NULL ) {
pClonedHead = pClonedNode = pNode- > next;
pNode- > next = pClonedNode- > next;
pNode = pNode- > next;
}
while ( pNode != NULL ) {
pClonedNode- > next = pNode- > next;
pClonedNode = pClonedNode- > next;
pNode- > next = pClonedNode- > next;
pNode = pNode- > next;
}
return pClonedHead;
}
RandomListNode* Clone ( RandomListNode* pHead)
{
CloneNodes ( pHead) ;
ConnectRandomNodes ( pHead) ;
return ReconnectNodes ( pHead) ;
}
} ;