一个链表的每个结点,有一个next指针指向下一个结点,还有一个random指针指向这个链表中的一个随机结点或者NULL,题目要求实现复制这个链表,返回复制后的新链表
如图所示:
1.先将单链表复制,如下图
2.找复杂指针,对新节点复杂指针赋值,如下图
while (pPre)
{
pCur = pPre->pNext;
if (NULL == pPre->pRandom)
pCur->pRandom = NULL;
else
pCur->pRandom = pPre->pRandom->pNext;
pPre = pCur->pNext;
}
3.拆结点,如下图
pPre = p1;
Node* pPre2 = pPre->pNext;
pCur = pPre->pNext;
while (pCur->pNext)
{
pPre->pNext = pCur->pNext;
pPre = pCur->pNext;
pCur->pNext = pPre->pNext;
pCur = pCur->pNext;
}
代码如下:
//结构体
typedef int DataType;
typedef struct ListNode
{
struct ListNode* pNext;
struct ListNode* pRandom;
DataType data;
}Node;
Node* BuyNode1(DataType d)
{
Node* NewNode = (Node*)malloc(sizeof(Node));
if (NewNode)
{
NewNode->data = d;
NewNode->pNext = NULL;
NewNode->pRandom = NULL;
return NewNode;
}
else
{
perror("malloc::BuyNode");
return NULL;
}
}
Node* CopyComplexLinkList(Node* p1)//复制复杂链表
{
Node* pPre = p1;
Node* NewNode = NULL;
Node* pCur = NULL;
//在原链表每个节点后与此节点相同的新节点
while (pPre)
{
NewNode = BuyNode1(pPre->data);
NewNode->pNext = pPre->pNext;
pPre->pNext = NewNode;
pPre = NewNode->pNext;
}
//给新结点随机指针域赋值
pPre = p1;
while (pPre)
{
pCur = pPre->pNext;
if (NULL == pPre->pRandom)
pCur->pRandom = NULL;
else
pCur->pRandom = pPre->pRandom->pNext;
pPre = pCur->pNext;
}
//将新结点拆下来
pPre = p1;
Node* pPre2 = pPre->pNext;
pCur = pPre->pNext;
while (pCur->pNext)
{
pPre->pNext = pCur->pNext;
pPre = pCur->pNext;
pCur->pNext = pPre->pNext;
pCur = pCur->pNext;
}
return pPre2;
}
//test.c
void ComplexLinkList_test()
{
Node node1, node2, node3, node4;
node4.data = 4;
node4.pNext = NULL;
node4.pRandom = NULL;
node3.data = 3;
node3.pNext = &node4;
node3.pRandom = &node3;
node2.data = 2;
node2.pNext = &node3;
node2.pRandom = &node1;
node1.data = 1;
node1.pNext = &node2;
node1.pRandom = &node3;
Node* ret = CopyComplexLinkList(&node1);
}