【数据结构】复杂链表的复制

实现复杂链表的复制。

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

思路就这样。

我直接给出代码

#pragmaonce
#include<stdio.h>
#include<malloc.h>
#include<assert.h>

typedefintDataType;

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

voidcreatComplexNode(ComplexNode*&pHead,DataTypex);
ComplexNode*CopyComplexNode(ComplexNode*pHead);
//创建复杂链表。
voidcreatComplexNode(ComplexNode*&pHead,DataTypex)
{
	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;
	}
	returnnewLink;
}

相关文章

键树的基本概念 键树又称数字查找树(Digital Search Tree)。 它是一棵度大于等于2的树,树中的每个结...
[TOC] 基本概念 数据: 数据 是对客观事物的符号表示,在计算机科学中指所有能输入到计算机中并被计算机...
[TOC] 反证法 基本概念: 一般地,假设原命题不成立(即 在原命题的条件下,结论不成立),经过正确的推...
最近抽空整理了&quot;数据结构和算法&quot;的相关文章。在整理过程中,对于每种数据结构和算法...
[TOC] 矩阵在计算机图形学、工程计算中占有举足轻重的地位。在数据结构中考虑的是如何用最小的内存空间...
[TOC] 大O表示法:算法的时间复杂度通常用大O符号表述,定义为T[n] = O(f(n))。称函数T(n)以f(n)为界或...