c_cpp 给出链表,使得每个节点包含一个附加的随机指针,该指针可以指向列表中的任何节点或为空。返回
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 给出链表,使得每个节点包含一个附加的随机指针,该指针可以指向列表中的任何节点或为空。返回相关的知识,希望对你有一定的参考价值。
struct ListNode {
int val;
ListNode *next, *rand
ListNode(int v) : val(v), next(NULL), rand(NULL) {}
}
ListNode *deep_copy_list_with_random_pointer(ListNode *head) {
if(!head) return NULL;
unordered_map<ListNode*, ListNode*> mp;
ListNode *p = head;
ListNode *dum = new ListNode(-1);
ListNode *q = dum;
// step1: deal with "next" pointers
while(p) {
ListNode *t = new ListNode(p->val);
q->next = t;
mp[p] = t;
q = q->next;
p = p->next;
}
// step2: deal with "rand" pointers
p = head;
q = dum->next;
while(p) {
if(p->rand == NULL) q->rand = NULL;
else q->rand = mp[p->rand];
p = p->next;
q = q->next;
}
/* concise version of step2
for(p = head; p; p = p->next) {
if(p->rand == NULL) mp[p]->rand = NULL;
else mp[p]->rand = mp[p->rand];
}
*/
return dum->next;
}
//==========================================
ListNode* clone_list_with_random_pointer(ListNode *head) {
if(!head) return NULL;
ListNode *clone_head = new ListNode(head->data);
unordered_map<ListNode*, ListNode*> mp;
mp[head] = clone_head;
ListNode *p1 = head->next, *p2 = clone_head; // did not use dummy node, so the code is a little bit longer
for(; p1; p1 = p1->next) {
p2->next = new ListNode(p1->data);
p2 = p2->next;
mp[p1] = p2;
}
for(ListNode *p1 = head; p1; p1 = p1->next) {
if(p1->random != NULL) {
mp[p1]->random = mp[p1->random];
}
}
return clone_head;
}
以上是关于c_cpp 给出链表,使得每个节点包含一个附加的随机指针,该指针可以指向列表中的任何节点或为空。返回的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode练习(Python):链表类:第86题:分隔链表:给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。 你应当保留两个分区中每个节点
数组与链表的优缺点
LintCode Python 简单级题目 链表求和
c_cpp 在Doubly链表中插入一个节点 - GeeksforGeeks
Leetcode练习(Python):哈希表类:第138题: 给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。 要求返回这个链表的 深拷贝。 我们用一个
c_cpp 链表节点的小练习。