复制带随机指针的链表
Posted olajennings
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了复制带随机指针的链表相关的知识,希望对你有一定的参考价值。
给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。
要求返回这个链表的 深拷贝。
我们用一个由 n
个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index]
表示:
val
:一个表示Node.val
的整数。random_index
:随机指针指向的节点索引(范围从0
到n-1
);如果不指向任何节点,则为null
。
/* // Definition for a Node. class Node { public: int val; Node* next; Node* random; Node(int _val) { val = _val; next = NULL; random = NULL; } }; */ class Solution { public: Node* copyRandomList(Node* head) { if(head == NULL){ return head; } Node *p = head; Node *q = NULL; while(p != NULL){ q = new Node(p->val); q->random = p->random; q->next = p->next; p->next = q; p = q->next; } Node *copyList = head->next; p = head; q = head->next; while(q->next != NULL){ if(q->random != NULL){ q->random = q->random->next; } else{ q->random = NULL; } q = q->next->next; } if(q->random != NULL){ q->random = q->random->next; } q = head->next; while(q->next != NULL){ p->next = q->next; p = p->next; q->next = p->next; q = q->next; } p->next = q->next; return copyList; } };
解题思路:
1.遍历一遍预原链表,在每个原结点后创建一个其拷贝结点,如:A -> A‘ -> B -> B‘ -> ······ -> X -> X‘ -> NULL
2.再从头遍历一遍链表处理random。注意,给random赋值的时候要注意对空指针的判断。
3.再从头遍历一遍链表处理next,将原列表与拷贝列表解开。注意:原列表最后一个结点要指向NULL。
4.返回拷贝链表。
时间复杂度=O(3n)=O(n), 空间复杂度=O(1).
以上是关于复制带随机指针的链表的主要内容,如果未能解决你的问题,请参考以下文章
[ 链表OJ题--C语言实现 ] 复制带随机指针的链表(带视频讲解哦)
LeetCode第138题—复制带随机指针的链表—Python实现