Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。
🌈个人主页:主页链接
🌈算法专栏:专栏链接
我会一直往里填充内容哒!
🌈LeetCode专栏:专栏链接
目前在刷初级算法的LeetBook 。若每日一题当中有力所能及的题目,也会当天做完发出
🌈代码仓库:Gitee链接
🌈点击关注=收获更多优质内容🌈
题目: 复制带随机指针的链表
题解:
这题虽然为中等难度,但找到方法后,考察的也仅是链表的增删查改四种操作。
这题可能很多人题目都没看懂,其实就是将题所给的链表完整的复制出来。
hhh,那能不能直接return head呢?显然不能。为什么?因为我试过啦
那么正经来看看如何去解这道题呢?
这里提供一种思路:首先将每个链表复制到原链表的后一个节点上去(也就是插入一个相同的节点)
之后每一个copy节点的random就为原节点的random->next,将其连接就好
之后再将copy链表拆除出来:copy->next等于copy->next->next,也就是跳过了下一个原节点。
之后在返回第一个copy节点就可以了。
第一个while循环为复制插入copy节点,当cur指针不为空的时候,三个指针轮流交换即可。很基础的插入操作,这里就不过多赘述。
插入后为这样。
之后每一个copy节点的random就为原节点的random->next,将其连接就好
当然这里涉及到一个边界问题:当random为空指针的时候,直接将其指向NULL即可
最后先记录下复制的头节点(也可以不记录,直接返回head->next也可)
提交代码:
代码实现:
#include<stdio.h> #include<malloc.h> struct Node { int val; struct Node *next; struct Node *random; }; struct Node* copyRandomList(struct Node* head) { struct Node * cur=head; if(!head)return head; while(cur) { struct Node *copy=(struct Node*)malloc(sizeof(struct Node)); struct Node *next=cur->next; copy->val=cur->val; copy->next=next; cur->next=copy; cur=next; } cur=head; while(cur) { struct Node *copy=cur->next; struct Node *next=cur->next->next; if(cur->random==NULL) copy->random=NULL; else copy->random=cur->random->next; cur=next; } cur=head; struct Node *head2=cur->next; while(cur) { struct Node *copy=cur->next; struct Node *next=cur->next->next; if(!next) copy->next=NULL; else copy->next=next->next; cur->next=next; cur=next; } return head2; }
完结撒花:
🌈本篇博客的内容【链表:Leetcode 138. 复制带随机指针的链表】已经结束。
🌈若对你有些许帮助,可以点赞、关注、评论支持下博主,你的支持将是我前进路上最大的动力。
🌈若以上内容有任何问题,欢迎在评论区指出。若对以上内容有任何不解,都可私信评论询问。
🌈诸君,山顶见!