Hello大家好!很高兴我们又见面啦!给生活添点passion,开始今天的编程之路!
我的博客:<但凡.
我的专栏:《编程之路》、《数据结构与算法之美》、《题海拾贝》
欢迎点赞,关注!
1、题目
题目链接:138. 随机链表的复制 - 力扣(LeetCode)
题解:
这个题的解答方法和平常的不太一样,我们需要先复制每个节点然后插入到原链表中,这样来设置每个新节点的randam节点。需要注意的是,我们需要处理特殊情况,也就是链表为NULL的情况。
/*** 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));newnode->val=x;newnode->next=NULL;newnode->random=NULL;return newnode;}void test(struct Node* head){struct Node* cur=head;while(cur){struct Node* newnode=buynode(cur->val);struct Node* curnext=cur->next;cur->next=newnode;newnode->next=curnext;cur=curnext;}}void setrandom(struct Node* head){struct Node* cur=head;while(cur){struct Node* Nnext=cur->next;if(cur->random){Nnext->random=cur->random->next;}//注意if条件。如果random是NULL的话,cur->random->next会报错struct Node* curnext=Nnext->next;cur=curnext;}}struct Node* SetNewList(struct Node* head){struct Node* cur=head;struct Node* newhead=head->next;struct Node* newcur=head->next;struct Node*curnext=newcur->next;while(curnext){newcur->next=curnext->next;newcur=newcur->next;curnext=newcur->next;}return newhead;}
struct Node* copyRandomList(struct Node* head) {//处理特殊情况————————————————if(head==NULL){return head;}test(head);setrandom(head);struct Node* newhead=SetNewList(head);return newhead;
}
好了,今天的内容就分享到这,我们下期再见!