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

随机链表的复制 (带random的链表深度拷贝)| C语言实现

随机链表的复制https://leetcode.cn/problems/copy-list-with-random-pointer/以上是LeetCode原题。

方法一:暴力求解(时间复杂度:O(N^2))

暴力求解的思路:

1.先复制一个链表

2.原链表和新链表同步找random的相对位置,找到就存。

struct Node* BuyRLNode(int val)
{struct Node* newnode = (struct Node*)malloc(sizeof(struct Node));newnode->val = val;return newnode;
}
struct Node* copyRandomList(struct Node* head) {//空链表if(head == NULL )return NULL;//新建立一个链表struct Node* newhead = BuyRLNode( head->val);newhead->random = newhead;newhead->next = NULL;struct Node* curorg = head->next;struct Node* tail = newhead;//对新链表尾插,直至和原链表一样长while(curorg){struct Node* newnode = BuyRLNode( curorg->val);tail->next = newnode;tail = newnode;curorg = curorg->next;}//尾节点置空tail->next = NULL;//设置random指针struct Node* curnew = newhead;curorg = head;while(curnew && curorg){struct Node* posorg = head;struct Node* posnew = newhead;//新链表利用旧链表的random指针同步寻找对应的random指针while(curorg->random != posorg){posnew = posnew -> next;posorg = posorg -> next;}curnew->random = posnew;curnew = curnew->next;curorg = curorg->next;}return newhead;
}

方法二:要求时间复杂度O(N),空间复杂度O(1)

以下是解题思路:

下面开始实现代码:

第一步:在原链表的每一个节点后面插入一个copy节点

这一步只需要开辟一个新节点,插到cur之后就可以了

下面的代码把copy的创建放到while里面而不是末尾,这样可以避免在cur到尾节点时cur  = curnext后cur == NULL,curnext = cur -> next会对空指针解引用。

第二步:对copy节点置random

因为原节点对应的copy节点都在原节点的后面,所以用cur->random找到random后,直接访问这个random的下一个就可以了。

这里把copy的创建放在循环内,同样是为了避免对空指针解引用。

第三步:将copy节点尾插成一个新链表,恢复原链表

以下是一般情况下尾插copy的解释:

当剩下最后两个尾节点的时候需要重点注意:

通过最后一张图解可以看到,cur的最后一个节点的next依然指向copy而不是NULL,所以应该用copy->next == NULL 当while的判定条件。

http://www.dtcms.com/a/577096.html

相关文章:

  • 大仓库推到GitHub大踩坑-Git LFS从安装到使用
  • 宁夏制作网站公司网站仿静态和静态的区别
  • 【App开发】02:Android Studio项目环境设置
  • 初识MYSQL —— 复合查询
  • 有网站可以接设计的单子做吗招投标网站
  • 基于 WPS TOROW 函数实现 VLOOKUP:多行多列转一行
  • 编译SQLite 3.51源码并体验新功能
  • CMP(类Cloudera CDP 7.3 404版华为泰山Kunpeng)和Apache Doris的对比
  • 水果电商网站建设相关文献163企业邮箱登入口
  • HarmonyOS黑马云音乐项目增加网络听歌功能(一、轮播图的实现)
  • 二、Netty-NIO核心原理详解(NIO核心组件:Buffer、Channel、Selector)
  • 网站短信接口怎么做网站开发环境有什么
  • 网站建设客户开发方案网站建设公司介绍
  • 矩阵乘法优化
  • sward零基础学习,如何在sward文档中集成Kanass事项
  • React使用笔记(持续更新中)
  • ArkTS运行时
  • C语言递归宏详解
  • 指令微调(Instruction Tuning)
  • Linux 中 NIC(网络接口卡)和协议栈的区别以及DPDK
  • MATLAB实现贝叶斯回归预测
  • ZYNQ介绍
  • 【Python】-- 趣味代码 - Piano游戏
  • 解决使用EasyExcel导出带公式的excel,公式不自动计算问题
  • 展示型网站多少钱建设大型网站的公司
  • 前端FAQ: 描述⼀下你最近使⽤过的前端框架,并解释为何选择它们?
  • [特殊字符] 微前端部署实战:Nginx 配置 HTTPS 与 CORS 跨域解决方案(示例版)
  • 短视频矩阵系统搭建指南:源码部署与全流程解析
  • 李沐动手学深度学习笔记(1)
  • 做网站云服务器选择多大带宽北京网站建设有哪些公司好