题目要求:复杂链表的复制。一个链表的每个节点,有一个指向next指针指向下一个节点,还有一
个random指针指向这个链表中的一个随机节点或者NULL,现在要求实现复制这个链表,
个random指针指向这个链表中的一个随机节点或者NULL,现在要求实现复制这个链表,
返回复制后的新链表。
#define _CRT_SECURE_NO_WARNINGS 1
typedef int DataType;
#define NULL 0
#include<stdio.h>
#include<windows.h>
#include<assert.h>
typedef struct Node
{
DataType data;
struct Node*next;
struct Node*random;
}Node, *LinkList;
void InitList(LinkList *L)
{
*L = (Node*)malloc(sizeof(Node));
if (*L == NULL){
printf("申请内存空间失败");
}
(*L)->next = NULL;
}
LinkList BuyNode(DataType data)
{
LinkList NewNode = NULL;
NewNode = (LinkList)malloc(sizeof(Node));
if (NewNode == NULL){
printf("为节点创建空间失败");
}
NewNode->data = data;
NewNode->random =NULL;
NewNode->next = NULL;
return NewNode;
}
void PrintList(LinkList L)
{
LinkList Cur = L;
if (L == NULL){
printf("NULL");
}
while (Cur)
{
if (Cur == NULL)
return;
printf("%d %d--->", Cur->data,Cur->random->data);
Cur = Cur->next;
}
printf("NULL\n");
}
void PushBack(LinkList* L, DataType data)
{
assert(L);
LinkList Cur = *L;
if (Cur == NULL){
Cur = BuyNode(data);
}
while (Cur->next)
{
Cur = Cur->next;
}
Cur->next = BuyNode(data);
}
LinkList Find(LinkList L, DataType data)
{
assert(L);
if (L == NULL){
return NULL;
}
LinkList Cur = L;
while (Cur != NULL)
{
if (Cur->data == data){
return Cur;
}
Cur = Cur->next;
}
return NULL;
}
LinkList CopyLinkListwithRandompoint(LinkList L)
{
LinkList CopyL = NULL;
LinkList Cur = NULL;
LinkList Tail = NULL;
LinkList NewNode = NULL;
if (L == NULL)
return NULL;
else if (L->next == NULL)
CopyL = L->next;
Cur = L->next;
while (Cur->next) //在单链表每一个节点后面插入一个data与原来链表
{ //相同的节点
NewNode = BuyNode(Cur->data);
NewNode->next = Cur->next;
Cur->next = NewNode;
Cur = NewNode->next;
}
NewNode = BuyNode(Cur->data);
Cur->next = NewNode;
Cur = L->next; //为新插入的节点赋随机域
while(Cur)
{
NewNode = Cur->next;
NewNode->random = Cur->random->next;
Cur = NewNode->next;
} //拆链表为原链表和复制后之后的链表
Cur = L->next;
NewNode = Cur->next;
Cur->next = NewNode->next;
NewNode->next = NULL;
CopyL = NewNode;
Tail = NewNode;
while (1)
{
Cur = Cur->next;
NewNode = Cur->next;
if (NULL == NewNode->next)
break;
Cur->next = NewNode->next;
NewNode->next = NULL;
Tail->next = NewNode;
Tail = Tail->next;
}
Cur->next = NULL;
Tail->next = NewNode;
Tail = Tail->next;
return CopyL;
}
void test()
{
LinkList L;
InitList(&L);
PushBack(&L, 1);
PushBack(&L, 2);
PushBack(&L, 3);
PushBack(&L, 4);
L->random = NULL;
LinkList L1 = Find(L, 1);
LinkList L2 = Find(L, 2);
LinkList L3 = Find(L, 3);
LinkList L4 = Find(L, 4);
L1->random = L4;
L2->random = L3;
L3->random = L1;
L4->random = L2;
PrintList(CopyLinkListwithRandompoint(L));
}
int main()
{
test();
system("pause");
return 0;