数据结构| |链表面试题之复杂链表的复制

首先来给大家介绍一下什么是复杂链表:
一个链表的每个节点,有一个指向next指针指向下一个节点,
还有一个random指针指向这个链表中的一个随机结点或者NULL
现在要求实现复制这个链表,返回复制后的新链表
结点如图:
复杂链表的结点

这里只写对复杂链表如何复制,对于复杂链表的遍历,可以看一下以前的博客,里面代码全都有复制,打印,测试函数都有。链接地址:https://blog.csdn.net/qq_40399012/article/details/81742603

接下来先讲解一下复制复杂链表的思路:
首先创建一个复杂链表,对于复制复杂链表可以在每个结点的后面增加一个data域一样的结点,新创建的结点就是我们要复制的链表,现在只是将指针域进行了复制。然后进行复制random域,最后将这些结点连接在一起。
如何进行random指针的复制:新创建的结点的random域指该结点的前一个节点的random域所指向的结点的下一个结点,这样就可以将random域进行复制了。
最后进行next域的连接就好了:
如图:
1.创建复杂链表
创建复杂链表
2.给结点后面增加一个data域相同的结点
增加结点
3.random指针域的复制
完成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;
}

以上就是链表面试题之复杂链表的复制的全部内容了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值