LeetCode138:Copy List with Random Pointer
2024-10-21 19:02:35
题目:
A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.
Return a deep copy of the list.
解题思路:
拷贝链表时,新节点的random指针不太好设置,因为是随机的,所以如果采用常规方法,必须每设置一个新节点的random指针时,必须到两链表中进行查找。
这里,我采用了一些小技巧,当拷贝一个新节点时,将该新节点连接到原节点的后面
第一步做完后,遍历链表,设置拷贝节点的random指针,设置拷贝节点的random指针时,可根据原节点的random指针进行设置,因为原节点的random指向的节点的下一个节点即为拷贝节点额random要指向的节点。
最后,将链表进行分离即可。
实现代码:
#include <iostream>
using namespace std; struct RandomListNode
{
int label;
RandomListNode *next, *random;
RandomListNode(int x) : label(x), next(NULL), random(NULL) {}
}; class Solution {
public:
RandomListNode *copyRandomList(RandomListNode *head) {
if(head == NULL)
return NULL;
RandomListNode *p = head;
while(p)
{
RandomListNode *node = new RandomListNode(p->label);//拷贝一个新节点,然后将该新节点链接到原节点的后面
node->next = p->next;
p->next = node;
p = node->next;
} p = head;
while(p)//根据原节点设置新节点的random指针
{
if(p->random)//如果原节点的random指针不为空则设置拷贝节点
{
//拷贝节点的random指针指向的节点可利用原节点的random指针找到,
//因为每个拷贝节点都在原节点的下一个节点
p->next->random = p->random->next;
} p = p->next->next;
} //将原链表和新建链表进行分离
RandomListNode *chead = head->next;
head->next = head->next->next;
RandomListNode *q = chead;
head = head->next;
while(head)
{
q->next = head->next;
head->next = head->next->next;
head = head->next;
q = q->next; }
return chead; }
};
int main(void)
{
return ;
}
最新文章
- SQL Server性能计数器部署(批量)
- 3 构建Mysql+heartbeat+DRBD+LVS集群应用系统系列之heartbeat的搭建
- Oracle中的数据类型
- 循环效率对比 js node c# mssql
- centreon 降低rrd磁盘读写
- 解决YUM无法正常工作
- Python调用C模块以及性能分析
- 在实体类中将数据库中数据类型为CLOB的数据转化成String类型
- C文件IO
- Forms身份验证和基于Role的权限验证
- Python学习笔记——进阶篇【第八周】———进程、线程、协程篇(Socket编程进阶&;多线程、多进程)
- 服务器返回webview字符串,用该字符串填满整个屏幕,不可缩放
- Natas Wargame Level25 Writeup(头部注入+POST/GET注入)
- 《深入分析Java web技术内幕》读书笔记(一)
- 常见的SQLALCHEMY列类型
- mysql攻防之写入漏洞
- 如何禁止chrome自动跳转https
- storm(二) 事务机制
- BZOJ1101 POI2007 Zap 【莫比乌斯反演】
- laravel-ide-helper 遇到There are no commands defined问题怎么解决