当前位置: 首页 > news >正文

随机链表的复制数据结构oj题(力口138)

目录

问题描述

问题解读分析

解决代码


问题描述

问题解读分析

        这里我们要注意深拷贝和随机指针,首先就是深拷贝对应的浅拷贝是和原链表用一个结点,而深拷贝则对应的不和原链表一个结点,也就是说需要我们自己开辟空间去创建一个结点和原链表一模一样。而这里随机指针,是链表中一个指针,他随机但是又固定,固定是因为我们不需要随机给他寻找结点,而是实例给,但是随机又不能琢磨他只能在相对结点的右边,而还有相对于这个结点的左边。所以这里最为复杂的是该如何处理random指针,这里很难寻找到相对结点靠左的结点和random对应,我们这里选择在原链表基础上进行拷贝,通过原链表上的random指针的next(这个表示在原链表上的下一个指针,这个指针就是复制的链表)与我们拷贝对应。很抽象上图:

 最后一步就是将原链表和复制好的链表断开

解决代码

/*** Definition for a Node.* struct Node {*     int val;*     struct Node *next;*     struct Node *random;* };*/
struct Node* buyNode(int x)
{struct Node* newnode = (struct Node*)malloc(sizeof(struct Node));if(newnode == NULL){perror("malloc");return NULL;}newnode->val = x;newnode->random= newnode->next = NULL;return newnode;
}void AddNode(struct Node* phead)
{struct Node* pcur = phead;while(pcur){struct Node* next = pcur->next;struct Node* newnode =buyNode(pcur->val);pcur->next = newnode;newnode->next = next;pcur = next;}
}
void setRandom(struct Node* phead)
{struct Node* pcur = phead;//根据newnode->random = pcur->random->nextwhile(pcur){struct Node* copy = pcur->next;if(pcur->random)//防止为空时解引用{copy->random = pcur->random->next;}pcur = copy->next;}
}
struct Node* copyRandomList(struct Node* head) {if(head == NULL)//防止没意义空指针的发生{return head;}//复制原链表AddNode(head);//复制randomsetRandom(head);//将原链表上的复制链表拆除struct Node* pcur = head;struct Node* copyHead=pcur->next;struct Node* copyTail = pcur->next;head->next = copyTail->next;//原链表链接while(pcur->next){//copyTail --- pcur->nextpcur = copyTail->next;copyTail->next = pcur->next;copyTail = copyTail->next;//pcur ----- pcur->nextpcur->next = copyTail->next;} return copyHead;
}

http://www.lryc.cn/news/590130.html

相关文章:

  • Mybatis的SQL编写—XML方式
  • 3分钟实战!用DeepSeek+墨刀AI生成智能对话APP原型图
  • 035_ClaudeCode_MCP_介绍
  • 电脑安装 Win10 提示无法在当前分区上安装Windows的解决办法
  • 【数据结构】「栈」(顺序栈、共享栈、链栈)
  • 现代前端开发流程:CI/CD与自动化部署实战
  • 多维动态规划题解——最小路径和【LeetCode】空间优化一维数组
  • 手撕设计模式之消息推送系统——桥接模式
  • Jenkins全方位CI/CD实战指南
  • U3D打包IOS的自我总结
  • 如何选择适合的云手机配置?解决资源不足带来的性能瓶颈
  • Unity Android Logcat插件 输出日志中文乱码解决
  • Kafka 与 RocketMQ 消息确认机制对比分析
  • 深度解析:Python实战京东资产拍卖平台爬虫,从ID抓取到详情数据落地
  • 2025年C++后端开发高频面试题深度解析:线程安全LRU缓存设计与实现
  • 短剧系统开发:塑造数字娱乐新未来
  • 面试150 二叉树的层序遍历
  • UE5 相机后处理材质与动态参数修改
  • 猫眼娱乐IOS开发一面手撕算法
  • 工业相机GigE数据接口的优势及应用
  • [特殊字符] 第1篇:什么是SQL?数据库是啥?我能吃吗?
  • SQL,在join中,on和where的区别
  • 锁存型霍尔 IC:定义、应用与优势全解析
  • Git问题排查与故障解决详解
  • 前端性能与可靠性工程:前端韧性工程 - 优雅降级与离线支持
  • 《设计模式之禅》笔记摘录 - 7.中介者模式
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘tkinter’问题
  • 网络编程/Java面试/TCPUDP区别
  • 【代码】Matlab鸟瞰图函数
  • AsyncRelayCommand示例学习