1、什么是复杂链表?
复杂链表就是,一个链表的每一个节点都有一个指向下一个节点的指针和指向随机节点或者NULL的指针。
2、分析:
要完成复杂链表的复制,首先应该向链表中的每一个元素都复制 下来,复制的位置应该是当前节点的下一个节点,如下图所示:
意思就是要拷贝的节点是当前节点的Next,要拷贝节点的rodom就是 当前节点的rodom的Next;最后再将这个链表拆分。
代码如下:
#pragma once
typedef int DataType;
typedef struct ComplexNode{
struct ComplexNode *Rodom;//指向随机节点
struct ComplexNode *NextNode;//指向下一个节点
DataType data;
}ComplexNode;
ComplexNode* BuyNode( DataType data);
ComplexNode* CopyNode(ComplexNode *ppHead);
ComplexNode* BuyNode(DataType data)//申请一个节点
{
ComplexNode* NewNode = (ComplexNode*)malloc(sizeof(ComplexNode));
NewNode->NextNode = NULL;
NewNode->Rodom = NULL;
NewNode->data = data;
return NewNode;
}
ComplexNode* CopyNode(ComplexNode *pHead)
{
ComplexNode* cur = pHead;
ComplexNode* copy =NULL;
while (cur)//复制next部分
{
copy = BuyNode(cur->data);
ComplexNode* Next = cur->NextNode;
cur->NextNode = copy;
copy->NextNode = Next;
cur = cur->NextNode->NextNode;
}
ComplexNode *ccur=pHead;
while (ccur)//复制rodom部分
{
copy = ccur->NextNode;
if (ccur->Rodom != NULL)
{
copy->Rodom = ccur->Rodom->NextNode;
}
else
copy->Rodom = NULL;
ccur = ccur->NextNode->NextNode;
}
ComplexNode* NewHead = pHead->NextNode;
ComplexNode* Cur = pHead;
ComplexNode *Copy =pHead->NextNode;
ComplexNode *Next = NULL;
ComplexNode *copyNext = NULL;
while (Cur)//拆分部分
{
Copy = Cur->NextNode;
Next = Copy->NextNode;
if (Next == NULL)//考虑是最后一个节点了
{
copyNext = NULL;
}
else
{
copyNext = Next->NextNode;
}
Cur->NextNode = Next;
Copy->NextNode = copyNext;
Cur = Next;
}
return NewHead;
}
void Print(ComplexNode *pHead)
{
ComplexNode* cur = pHead;
while (cur)
{
printf("%d ", cur->data);
cur = cur->NextNode;
}
}
test()//构造链表
{
ComplexNode* node1 = BuyNode(1);
ComplexNode* node2 = BuyNode(2);
ComplexNode* node3 = BuyNode(3);
ComplexNode* node4 = BuyNode(4);
ComplexNode* node5 = BuyNode(5);
node1->NextNode = node2;
node2->NextNode = node3;
node3->NextNode = node4;
node4->NextNode = node5;
node5->NextNode = NULL;
node1->Rodom = node4;
node2->Rodom = node1;
node3->Rodom = NULL;
node4->Rodom = node2;
node5->Rodom = node4;
ComplexNode* Node;
Node=CopyNode(node1);
Print(Node);
}
测试结果: