链表—复杂链表的复制

本文介绍了一种复杂链表的复制方法,链表中的节点除了next指针外,还包含指向链表中任意节点的random指针。文章详细阐述了复制过程:首先插入复制节点,然后设置复制节点的random指针,并最后分离原链表和复制链表。
摘要由CSDN通过智能技术生成

复杂链表的复制。一个链表的每个节点,有一个指向next指针指向下一个节点,还有一个random指针指向这个链表中的一个随机节点或者NULL,现在要求实现复制这个链表,返回复制后的新链表。

//ps: 复杂链表的结构
struct ComplexNode
{
int _data ; // 数据
struct ComplexNode * _next; // 指向下一个节点的指针
struct ComplexNode * _random; // 指向随机节点(可以是链表中的任意节点 or 空)
};




分析:

对于节点单个依次复制之后再将random指针依次后移。将原来的节点删掉之后依次链接复制后的节点

ComplexNode* CopyList(ComplexNode* plist)  
{  
    if (plist == NULL)  
    {  
        return NULL;  
    }  
    ComplexNode* newnode = NULL;  
    ComplexNode* tmp = plist;  
    //1.1 插入节点  
    while (tmp != NULL)  
    {  
        newnode = (ComplexNode*)malloc(sizeof(ComplexNode));  
        newnode->_data = tmp->_data;  
        newnode->_next = tmp->_next;  
        newnode->_random = NULL;  
        tmp->_next = newnode;  
        tmp = tmp->_next->_next;  
    }  
    //1.2开始连接random  
    tmp = plist;  
    newnode = plist->_next;  
    while (tmp != NULL)  
    {  
        if (tmp->_random != NULL)  
        {  
            newnode->_random = tmp->_random->_next;  
        }  
        tmp = tmp->_next->_next;  
        if (tmp)  
        {  
            newnode = tmp->_next;  
        }  
    }  
    //2.分离两个链表  
    ComplexNode* res = plist->_next;  
    tmp = plist;  
    tmp->_next = tmp->_next->_next;  
    tmp = tmp->_next;  
    newnode = plist->_next;  
    while ((tmp->_next != NULL)&&(tmp != NULL))  
    {  
        newnode->_next = newnode->_next->_next;  
        tmp->_next = tmp->_next->_next;  
        tmp = tmp->_next;  
        newnode = newnode->_next;  
    }  
    return res;  
}  
  
void Test1()  
{   
    ComplexNode* list = NULL;  
    ComplexNode* node1 = PushBack(&list, 2);  
    ComplexNode* node2 = PushBack(&list, 5);  
    ComplexNode* node3 = PushBack(&list, 6);  
    node1->_random = node3;  
    node2->_random = node1;  
    node3->_random = node2;  
    ComplexNode* res = CopyList(list);  
}  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值