复杂单链表的复制

typedef struct ComplexList
{
	DataType _data; //数据
	struct ComplexList *_next;  //指向下一节点的指针
	struct ComplexList *_random;
}ComplexList, *PComplexList;

void InitList(PComplexList& pHead)
{
	pHead = NULL;
}

ComplexList *BuyNode(DataType x)
{
	ComplexList *newNode;
	newNode = (ComplexList*)malloc(sizeof(ComplexList));
	newNode->_data = x;
	newNode->_next = NULL;
	newNode->_random = NULL;
	return newNode;
}
// 创建一个复杂单链表
void InsertNode(PComplexList& pHead)
{
	ComplexList *tmp = pHead;
	ComplexList *cur = pHead;

	int index=1;
	if(pHead == NULL)
	{
		pHead = BuyNode(1);
		pHead->_random = NULL;
	}
	tmp = pHead;
	for(;index<6;index++)
	{
		ComplexList *prve = tmp;
		tmp->_next = BuyNode(index+1);
		tmp = tmp->_next;
		tmp->_random = prve;
	}
	pHead->_random = tmp;

}

void PrintList(ComplexList* pHead)
{
	while(pHead != NULL)
	{
		printf("%d->",pHead->_data);
		pHead=pHead->_next;
	}
	printf("NULL\n");
}

//复制
ComplexList *CopyList(PComplexList& pHead)
{
	ComplexList *begin = pHead;

	ComplexList *cur ;
	ComplexList *prve ;
	ComplexList *pa ;
	ComplexList *pb;
	if(pHead == NULL)
	{
		return NULL;
	}

	//将此单链表的每个元素拷贝一份,插入到每个原来单链表节点的后面
	while(begin != NULL)
	{
		ComplexList *tmp =begin;
		ComplexList *prve = begin->_next;
		ComplexList *newNode =BuyNode(begin->_data);
		begin = begin->_next;
		newNode->_next =prve;
		tmp->_next = newNode;

	}

	//将每个新插入节点的_random连接起来
	cur =pHead;
	prve = pHead->_next;
	while(cur)
	{
		prve->_random = cur->_random->_next;
		if(prve->_next == NULL)
		{
			break;
		}
		prve = prve->_next->_next ;
		cur = cur->_next->_next ;
	}

	//拆分成两个单链表
	pa = pHead;
	pb = pHead->_next ;
	while(pa)
	{
		if(pb->_next  == NULL)
		{
			pa->_next =NULL;
			break;
		}
		ComplexList *prveA = pa;
		ComplexList *curA = pa->_next->_next;
		ComplexList *prveB = pb;
		ComplexList *curB = pb->_next->_next;
		prveA->_next = curA;
		prveB->_next  = curB;
		pa= pa->_next ;
		pb = pb->_next;
	}
	return pb;
}
时间: 2024-08-07 04:10:49

复杂单链表的复制的相关文章

单链表复制早已难不到你,但若我们再加个指针...

面试 18:复杂链表的复制(剑指 Offer 第 26 题) 在上一篇推文中,我们留下的习题是来自<剑指 Offer> 的面试题 26:复杂链表的复制. 请实现复杂链表的复制,在复杂链表中,每个结点除了 next 指针指向下一个结点外,还有一个 sibling 指向链表中的任意结点或者 NULL.比如下图就是一个含有 5 个结点的复杂链表. image.png 提前想好测试用例 依旧是我们熟悉的第一步,先想好我们的测试用例: 输入一个 null ,期望什么也不输出: 输入一个结点,siblin

链表——复杂链表的复制

题目: 在复杂链表中,每个节点除了一个next引用外还有一个random引用指向链表中的任意结点或者null,实现函数复制该链表. 方法一:HashMap存储结点对信息 第一步:(遍历原链表一次)不考虑random引用,将原链表作为单链表进行复制,并用HashMap将结点的配对信息存储: 第二步:(第二次遍历原链表)设置复制链表上的每个random结点: 总的时间复杂度为O(N),空间复杂度为O(N). 代码如下: /** * Definition for singly-linked list

c# 单链表实现 简单示例(可复制直接运行)

最近学习数据结构,发现c# 其实和c 的链表的实现差不多的 下面是一段可直接运行的代码 1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 using System.Threading; 5 6 namespace SingleLinkedList 7 { 8 class Program 9 { 10 static void Main(string[] args) 11 { 12 13 //实例调用

浅谈复杂链表的复制

链表是一种很常见的数据结构,单链表.双向链表.循环链表和复杂链表都是其衍生物.复杂链表之所以命名为复杂链表,也正是由于其结构的复杂.它比其他其他种类的链表多了一个指针域,这个指针域可以指向链表中的任一结点,也可以为空. 其结构定义如下: struct ComplexNode { DataType _data; struct ComplexNode * _next; struct ComplexNode * _random;//随机域 }; 结构示例: ps:蓝色指针为next域,红色为rando

单链表实现多项式的表示及运算

单链表实现多项式的加法运算 最近学习数据结构的线性表,有顺序存储和链表两种,多项式的表示和运算,最能巩固学习成果,现在提供详细代码,来实现多项式的加法运算. 多项式用单链表最为合适,不会造成更多的资源浪费. 如果你恰好用的这本书--数据结构(Java版)(第4版)(叶核亚),推荐你去下面这个链接下载书本源代码,将更助你学的轻松. http://download.csdn.net/detail/wang______jing/9907538 1 //单链表类,实现一些基本单链表的操作 2 publi

线性表—单链表

.1.链式存储结构实现 单链表和双链表(这边讲单链表). 2.基础概念 a.结点:结点由数据域和地址域(链)两部分组成.而结点整体在效果上可以看作是该结点的地址(指针).这个地址域一般是后继元素的地址(即下一个结点的总体).所以最后一个元素的地址域为^,其表示空,即没有后续元素.b.单链表:每个结点只有一个地址域的线性链表称为单链表.c.双链表:每个结点有两个地址域的线性表链称为双链表,两个地址域分别指向前驱元素和后继元素. 3.单链表的实现 线性表接口LList: package com.cl

学习笔记:单链表实现多项式相乘(一)

单链表实现多项式相乘,有这样的一个思路可以参考: 实现多项式相乘,最关键的是系数和指数的两个数据,这里命名为coef和HighPower. 最简便的办法是使用两个嵌套循环例如(3x^2+4x^1)(x^2+2x^4)用3x^2遍历另外一个括号内的数据,同时实现本身括号内的遍历. 这个想法的核心程序可归纳为以下: while(pList!=NULL){ while(pList2!=NULL){ pNew=(PNODE)malloc(sizeof(NODE)); pNew->pNext=NULL;

C++单链表的设计与实现

单链表是一种常见的数据结构,c++不同于C的语言特性是封装.继承和多态.若要实现单链表,首先我们要明确什么是单链表,链表是由一个或多个节点构成的,实现链表的数据结构,我们首先是要明确的是什么是节点. 节点是由数据+该节点类型的指针组成的,如下: class SeqNode { public: friend class SeqList;//定义友元类,使链表类能够访问节点类的私有成员 SeqNode(DateType data) :_data(data), _next(NULL) { } priv

算法题:复制复杂链表之复制连接法

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 上篇文章算法题:复制复杂链表之空间换时间法我们给出了用映射的方法来为新复制的链表中的每个结点设置any指针,本文给出的是<剑指offer>上给出的算法与代码,<剑指offer>上提到该算法的实现三个步骤:        第一步:复制原始链表的任意结点N并创建新结点N',在把N'连接到N的后面:        第二步:设置每个结点的any指针:        第三步:将长链表分成两个链表,一个是原始链表,另外一个就是我们所要求的复制