C语言/数据解构——(随即链表的复制)

一.前言

嗨嗨嗨,大家好久不见。已经有好几天没更新了。今天我们就分享一道链表题吧——随即链表的复制https://leetcode.cn/problems/copy-list-with-random-pointer废话不多说,让我们直接开始今天的题目分享吧。

二.正文

1.1题目描述

他和单链表不同的是,结构体里还多一个random指针,指向随机节点。

这道题的意思就是想让我们将原链表完全复制下来,并且将复制好的链表返回到服务器上。

1.2题目分析

(i)创建节点,并尾插到原节点后

这道题我们可以通过遍历一个节点的同时,就穿插一个复制该节点数据的复制节点在该节点后面。

通过循环语句,我们最后会得到一个每一个原节点的后面尾插了一个新的复制节点。如图所示:

这里我们只是先处理了next指针,下面我们将处理random指针。让复制节点的random指针指向和原节点保持一致。

值得注意的是上面的这些节点是我们通过malloc函数自己手动创建的。红叉的地方意味着原来的next指向断掉了。

(ii)将复制节点的random指针指向正确位置

这里我们需要让复制节点的random指针和原节点指向一致,但不是指向原节点,而是指向复制节点。

如果原节点的random指针指向为NULL,那么与之对应的,该节点的复制节点也需要指向NULL。

如果该节点(假设l1)的random指针不指向NULL。而是指向另外一个节点(假设为l2)。那么与之对应的,l1的复制节点的random也应该指向l2的复制节点。那么这一步该如何实现呢?

我们假设一个指针pcur现在指向第三个节点13。pcur->next->random=pcur->random->next。

这样两个复制节点就可以通过pcur建立联系了。如图所示:

(iii)将复制链表从原链表上剥离下来

这里我们可以创建一个哨兵位,然后陆续从后面插入我们需要的复制节点即可。然后将哨兵位后面的有效节点存起来,在哨兵位free掉,归还给操作系统,将指向该哨兵位节点的指针置为NULL。最后返回之前存的有效节点即可

1.3代码实现

*** Definition for a Node.* struct Node {*     int val;*     struct Node *next;*     struct Node *random;* };*/
typedef struct Node ListNode;
struct Node* copyRandomList(struct Node* head)
{if(head==NULL)return head;ListNode* pcur = head;while (pcur){ListNode* copy = (ListNode*)malloc(sizeof(ListNode));copy->val = pcur->val;copy->next = pcur->next;pcur->next = copy;pcur = pcur->next->next;}pcur = head;while (pcur){ListNode* copy = pcur->next;if (pcur->random == NULL)copy->random= NULL;elsepcur->next->random = pcur->random->next;pcur = copy->next;}ListNode* newhead = (ListNode*)malloc(sizeof(ListNode));ListNode* ppcur;ppcur = newhead;pcur = head->next;int count = 0;while (pcur){if (count % 2 == 0){ppcur->next = pcur;ppcur = ppcur->next;}pcur = pcur->next;count++;}ListNode* ret = newhead->next;free(newhead);newhead = NULL;return ret;
}

值得注意的是上面的代码是在力扣环境上运行的。

三.前言

今天的分享就到此结束喽,咱们下次再见,拜拜。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/695474.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初识指针(5)<C语言>

前言 在前几篇文章中,已经介绍了指针一些基本概念、用途和一些不同类型的指针,下文将介绍某些指针类型的运用。本文主要介绍函数指针数组、转移表(函数指针的用途)、回调函数、qsort使用举例等。 函数指针数组 函数指针数组即每个…

探索国外静态IP:跨境网络的基石

在数字化时代,互联网已经成为我们生活和工作的重要部分。无论是远程办公、在线教育还是跨境电商,稳定的网络连接都至关重要。而在这个过程中,国外静态IP以其独特的优势,成为了许多企业和个人用户的选择。 一、国外静态IP的应用场景…

排序-快速排序(Quick Sort)

快排的简介 快速排序(Quick Sort)是一种高效的排序算法,采用分治法的策略,其基本思想是选择一个基准元素,通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据要…

ViewModel 完全指南:实践与背后原理全解

一、引言 在现代Android应用开发中,处理UI数据的有效管理和状态保持是开发者面临的重要挑战之一。Google推出的Jetpack组件库中的ViewModel已成为解决这些问题的关键工具。ViewModel旨在以生命周期意识的方式存储和管理界面相关的数据,从而使数据在配置…

从iconfont引入线上字体库

如果是长期使用建议直接下载字体包 /* 在线链接服务仅供平台体验和调试使用,平台不承诺服务的稳定性,企业客户需下载字体包自行发布使用并做好备份。 */ 例如使用阿里妈妈数黑体 https://www.iconfont.cn/fonts/detail?spma313x.fonts_index.i1.d9df…

福建建设工程造价信息网2023年1至12月工程材料信息价期刊汇总

福建省最新造价信息网工程材料信息价期刊可打开 www.zgjct.com 直接下载,历年造价信息期刊也可查询,所有材料信息价格都由官方发布,如有疑问可咨询网站人工客服微信 造价信息期刊更新明细如下: 福州市造价信息网各类工程信息价期刊下载 福州市工程材料信息价2023年…

在全志H616核桃派开发板上进行PyQt5的代码编写和运行

核桃派本地 在上一节我们通过Qt Designer设计了ui窗口并转换成了Python代码,由于是Python编程,因此我们可以在核桃派开发板打开Python代码进行编程。 在核桃派上推荐使用Thonny来打开编写Python文件, 使用请参考:Thonny IDE。 打开上一节生…

BGP学习二:BGP通告原则,BGP反射器,BGP路径属性细致讲解,新手小白无负担

目录 一.AS号 二.BGP路由生成 1.network 2.import-route引入 三.BGP通告原则 1.只发布最优且有效的路由 2.从EBGP获取的路由,会发布给所有对等体 3.水平分割原则 4.IBGP学习BGP默认不发送给EBGP,但如果也从IGP学习到了这条路由,就发…

乡村振兴与乡村旅游深度融合:依托乡村自然和文化资源,发展乡村旅游产业,促进农民增收致富,打造特色美丽乡村

目录 一、引言 二、乡村振兴与乡村旅游的内在联系 三、依托乡村自然和文化资源发展乡村旅游产业 (一)挖掘乡村自然资源优势,打造特色旅游品牌 (二)挖掘乡村文化资源内涵,丰富旅游活动内容 四、促进农…

PG的事务ID回卷逻辑

PG到目前为止使用的事务ID仍然是32位的,在内存计算时虽然已经使用64位事务ID,但是存储在页中tuple仍然使用32位事务ID,这就是说,事务ID回卷仍然是必须处理的问题。 所谓PG事务ID回卷,简单地说,就是在数据库…

网页版五子棋的自动化测试

目录 前言 一、主要技术 二、测试环境的准备部署 三、测试用例 四、执行测试 4.1、公共类设计 创建浏览器驱动对象 测试套件 释放驱动类 4.2、功能测试 登录页面 注册页面 游戏大厅页面 游戏房间页面 测试套件结果 4.3、界面测试 登录页面 注册页面 游戏大…

python如何单步调试

Python怎么单步调试?下面给大家介绍一下单步调试: 方法一:执行 python -m pdb myscript.py (Pdb) 会自己主动停在第一行。等待调试,这时你能够看看帮助。 方法二:在所调试程序的开头中:import pdb 并在你…