实现复杂链表的复制。

    因为复杂链表中每个节点都有一个指向任意节点的指针。所以在确定这个链表的复制的时候。我们需要进行空间来换取时间上的效率。然后我们可以将链表复制项结合在拆分。

    思路就这样。

    我直接给出代码:

#pragma once
#include <stdio.h>
#include <malloc.h>
#include <assert.h>

typedef int DataType;

typedef struct ComplexNode
{
	DataType	 _data;				// 数据
	struct ComplexNode* _next;		// 指向下一个节点的指针
	struct ComplexNode* _random;	// 指向随机节点
}ComplexNode;

void creatComplexNode(ComplexNode* &pHead,DataType x);
ComplexNode* CopyComplexNode(ComplexNode* pHead);
//创建复杂链表。
void creatComplexNode(ComplexNode* &pHead,DataType x)
{
	ComplexNode *ret,*endNode;
	if(pHead == NULL)
	{
		pHead = (ComplexNode*)malloc(sizeof(ComplexNode));
		pHead->_random = NULL;
		pHead->_data = x;
		pHead->_next = NULL;
		return;
	}
	endNode = pHead;
	ret = endNode;
	while(endNode->_next)
	{
		ret = endNode;
		endNode = endNode->_next;
	}
	endNode->_next = (ComplexNode*)malloc(sizeof(ComplexNode));
	endNode = endNode->_next;
	endNode->_next = NULL;
	endNode->_data = x;
	endNode->_random = ret;
}

//解决复杂链表的复制。可以把其中的操作分为3个步骤:
//合并。
//复制随机指针值。
//拆分。
ComplexNode *CopyComplexNode(ComplexNode *pHead)
{
	ComplexNode *copyNode;
	ComplexNode *pNode = pHead;
	ComplexNode *newLink = NULL;
	ComplexNode *newNode = NULL;
	assert(pHead);
	while(pNode != NULL)
	{
		copyNode = (ComplexNode*)malloc(sizeof(ComplexNode));
		copyNode->_data = pNode->_data;
		copyNode->_next = pNode->_next;
		copyNode->_random = NULL;

		pNode->_next = copyNode;
		
		pNode = copyNode->_next;
	}

	pNode = pHead;

	while(pNode != NULL)
	{
		copyNode = pNode->_next;
		if(pNode->_random != NULL)
		{
			copyNode->_random = pNode->_random->_next;
		}
		pNode = copyNode->_next;
	}

	pNode = pHead;
	newLink = pNode->_next;
	while(pNode != NULL)
	{
		newNode = pNode->_next;
		pNode->_next = newNode->_next;
		pNode = pNode->_next;
		if(newNode->_next != NULL)
			newNode->_next = pNode->_next;
	}
	return newLink;
}