首先来给大家介绍一下什么是复杂链表:
一个链表的每个节点,有一个指向next指针指向下一个节点,
还有一个random指针指向这个链表中的一个随机结点或者NULL
现在要求实现复制这个链表,返回复制后的新链表
结点如图:
这里只写对复杂链表如何复制,对于复杂链表的遍历,可以看一下以前的博客,里面代码全都有复制,打印,测试函数都有。链接地址:https://blog.csdn.net/qq_40399012/article/details/81742603
接下来先讲解一下复制复杂链表的思路:
首先创建一个复杂链表,对于复制复杂链表可以在每个结点的后面增加一个data域一样的结点,新创建的结点就是我们要复制的链表,现在只是将指针域进行了复制。然后进行复制random域,最后将这些结点连接在一起。
如何进行random指针的复制:新创建的结点的random域指该结点的前一个节点的random域所指向的结点的下一个结点,这样就可以将random域进行复制了。
最后进行next域的连接就好了:
如图:
1.创建复杂链表
2.给结点后面增加一个data域相同的结点
3.random指针域的复制
4.next域的连接
最后返回pNewList指针所指向的链表就是复制好的复杂链表。
代码如下:
//申请结点的函数
//增加结点的时候,需要申请一个结点
ComplexNode* BuyNode_Complex(DataType d)
{
ComplexNode* newNode = (ComplexNode*)malloc(sizeof(ComplexNode));
if (newNode == NULL)
{
printf("error!");
}
newNode->data = d;
newNode->next = NULL;
newNode->random = NULL;
return newNode;
}
//复杂链表的复制
ComplexNode* CopyComplexList(ComplexNode* List)
{
ComplexNode* cur = List;
ComplexNode* next = NULL;
ComplexNode* newList = NULL;
//给每一个结点后面再加一个结点
while (cur != NULL)
{
ComplexNode* newNode = BuyNode_Complex(cur->data);
newNode->next = cur->next;
cur->next = newNode;
cur = newNode->next;
}
//增加random指针域,新的结点的random指向原先random的next
cur = List;
next = cur->next;
while (next->next != NULL)
{
next->random = cur->random->next;
cur = next->next;
next = cur->next;
}
//断开原先的结点与现在结点的连接,将现在的结点连接起来
cur = List->next;
next = cur->next;
newList = cur;
while (next != NULL)
{
cur->next = next->next;
cur = next->next;
next = cur->next;
}
//结束,返回复制的复杂链表
return newList;
}
以上就是链表面试题之复杂链表的复制的全部内容了。