复杂链表的复制

来源:互联网 发布:java 更改数据库 编辑:程序博客网 时间:2024/06/10 07:13

什么是复杂链表

复杂链表就是,有一个单链表有两个指针,一个指针指向下一个节点,另一个指针指向任何节点,可以是指向空,可以指向自己,可以指向链表中的任意节点。
形如:
这里写图片描述


复杂链表的结构

有两个指针,一个next,一个random,还有一个数据。

struct Node{    int _data;//值    Node* _next;//指向下一个节点的指针    Node* _random;//指向任意节点的指针};

复杂链表的复制简单实现

有这样一个复杂链表:
这里写图片描述
分三个部分进行复制:
第一步:
把每个节点复制一个链在原来的那个节点上,新节点的random置空。
这里写图片描述
第二步:将新节点的random链接起来
这里写图片描述
第三步:将两个链表摘开,就是将新复制的节点摘下来,链接起来
这里写图片描述
代码:

Node* ComplexCopy(Node* head){    Node* cur = head;    //复制新节点连在原来的后面,将新节点的random置空    while (cur)    {        Node* tmp = new Node;        tmp->_data = cur->_data;        tmp->_next = cur->_next;        tmp->_random = NULL;        cur->_next = tmp;        cur = tmp->_next;    }    //将新节点的random链接起来    cur = head;    Node* tmp = NULL;    while (cur)    {        tmp = cur->_next;        if (cur->_random)            tmp->_random = cur->_random->_next;        cur = tmp->_next;    }    //摘节点    cur = head;    Node* newHead = head->_next;    Node* next = NULL;    while (cur)    {        next = cur->_next;        cur->_next = next->_next;        tmp = cur->_next;        if (tmp)        {            next->_next = tmp->_next;            next = tmp->_next;        }        cur = tmp;    }    return newHead;}

整体代码:

#include <iostream>using namespace std;struct Node{    int _data;//值    Node* _next;//指向下一个节点的指针    Node* _random;//指向任意节点的指针};Node* ComplexCopy(Node* head){    Node* cur = head;    //复制新节点连在原来的后面,将新节点的random置空    while (cur)    {        Node* tmp = new Node;        tmp->_data = cur->_data;        tmp->_next = cur->_next;        tmp->_random = NULL;        cur->_next = tmp;        cur = tmp->_next;    }    //将新节点的random链接起来    cur = head;    Node* tmp = NULL;    while (cur)    {        tmp = cur->_next;        if (cur->_random)            tmp->_random = cur->_random->_next;        cur = tmp->_next;    }    //摘节点    cur = head;    Node* newHead = head->_next;    Node* next = NULL;    while (cur)    {        next = cur->_next;        cur->_next = next->_next;        tmp = cur->_next;        if (tmp)        {            next->_next = tmp->_next;            next = tmp->_next;        }        cur = tmp;    }    return newHead;}void TestComplexCopy()//测试{    Node* ptr1 = new Node;    Node* ptr2 = new Node;    Node* ptr3 = new Node;    Node* ptr4 = new Node;    ptr1->_data = 3;    ptr1->_next = ptr2;    ptr1->_random = ptr3;    ptr2->_data = 9;    ptr2->_next = ptr3;    ptr2->_random = NULL;    ptr3->_data = 1;    ptr3->_next = ptr4;    ptr3->_random = ptr3;    ptr4->_data = 5;    ptr4->_next = NULL;    ptr4->_random = ptr2;    ComplexCopy(ptr1);}int main(){    TestComplexCopy();    return 0;}
1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 被香港中炎骗了怎么办 房东要收回店面怎么办 天猫字迹模糊怎么办 淘宝类目不叫上架怎么办 淘宝直播有延迟怎么办 淘宝直播间中奖怎么办 微信扫码付款后卖家不发货怎么办 淘宝打骚扰电话怎么办 淘宝卖家打骚扰电话怎么办 被商家打了怎么办 保底消费入坑怎么办 留党查看到期怎么办 遭遇淘宝控价怎么办 淘宝店没有了怎么办 淘宝店铺运费险不出单怎么办 闲鱼定金被骗怎么办 肯德基团购过期怎么办 word不可以修改怎么办 店铺预售不发货怎么办 埋件设置不符合怎么办 闲鱼付了款卖家不发货怎么办 微信里付了款卖家不发货怎么办 运动鞋穿臭了怎么办 小车陷泥土了怎么办 孩子有心事不说怎么办 网状运动鞋乱了怎么办 运动鞋布面坏了怎么办 运动鞋面破了怎么办 脚磨烂了怎么办小妙招 网眼运动鞋破了怎么办 运动鞋后面烂了怎么办 运动鞋面坏了怎么办 磨档磨的特别疼怎么办 夏天高跟鞋里面脏了怎么办 走路鞋底有声音怎么办 鞋后跟海绵塌了怎么办 鞋后跟凹进去了怎么办 穿高跟鞋臭脚怎么办 运动鞋磨后脚跟怎么办 鞋两边磨脚踝怎么办 新鞋子磨脚踝怎么办