[LintCode]105.复制带随机指针的链表
来源:互联网 发布:东莞学编程 编辑:程序博客网 时间:2024/06/18 05:21
给出一个链表,每个节点包含一个额外增加的随机指针可以指向链表中的任何节点或空的节点。
返回一个深拷贝的链表。
/** * Definition for singly-linked list with a random pointer. * struct RandomListNode { * int label; * RandomListNode *next, *random; * RandomListNode(int x) : label(x), next(NULL), random(NULL) {} * }; */class Solution {public: /** * @param head: The head of linked list with a random pointer. * @return: A new head of a deep copy of the list. */ RandomListNode *copyRandomList(RandomListNode *head) { if(head == NULL) return NULL; RandomListNode* pCloneHead = new RandomListNode(head->label); pCloneHead->next = head->next; pCloneHead->random = head->random; pCloneHead->next = copyRandomList(head->next); return pCloneHead; }};
1.首先从左到右遍历链表,对每个节点都复制生成相应的副本节点,然后把副本节点放在当前节点和下一个要遍历节点的中间。
2.再从左到右遍历链表,在遍历时设置每一个副本节点的random指针。
3.此时所有的节点与副本节点串在一起,将其分离即可。
class Solution {public: RandomListNode *copyRandomList(RandomListNode *head) { if (head==NULL) return NULL; nodeClone(head); connectRandom(head); return reconnect(head); }//[1]复制结点,插入到原结点后方void nodeClone(RandomListNode *head){ RandomListNode *pNode = head; while (pNode != NULL) { RandomListNode *pClone = new RandomListNode(pNode->label); pClone->next = pNode->next; pNode->next = pClone; pNode = pClone->next; }} //[2]还原新结点的random指针void connectRandom(RandomListNode *head){ RandomListNode *pNode = head; while (pNode != NULL) { RandomListNode *pClone = pNode->next; if (pNode->random) { pClone->random = pNode->random->next; } pNode = pClone->next; }} //[3]拆分RandomListNode *reconnect(RandomListNode *head){ RandomListNode *p = head; RandomListNode *result = p->next; RandomListNode *pp = result; while(p){ if(p->next->next){ p->next = p->next->next; pp->next = pp->next->next; }else{ p->next = NULL; pp->next = NULL; } p = p->next; pp = pp->next; } return result;}};
阅读全文
0 0
- [LintCode]105.复制带随机指针的链表
- LintCode复制带随机指针的链表
- LintCode(105) 复制带随机指针的链表
- LintCode:复制带随机指针的链表
- lintcode,复制带随机指针的链表
- lintcode,复制带随机指针的链表
- LintCode(M) 复制带随机指针的复杂链表
- LintCode 105-复制带随机指针的链表
- Lintcode: 复制带随机指针的链表
- lintcode 复制带随机指针的链表(105)
- 复制带随机指针的链表-LintCode
- LintCode:M-复制带随机指针的链表
- LintCode-剑指Offer-(105)复制带随机指针的链表
- [LintCode] 复制带随机指针的链表 Copy List with Random Pointer
- 复制带随机指针的链表
- 复制带随机指针的链表
- 复制带随机指针的链表
- 复制带随机指针的链表
- Android NKD初探
- Java使用正则提取字符串
- 基于java的百度地图逆向解析(根据坐标返回地址)
- script中未正确定义'<'
- 335. Self Crossing
- [LintCode]105.复制带随机指针的链表
- 关于蓝牙历史以及蓝牙基本介绍
- 我是程序猿
- 机器学习基础-学习笔记 优化分析(二)
- 常量的特点
- SAPUI5教程——URLHelper的使用技巧
- [Python]深入理解 Python 异步编程(上)
- SAPUI5教程——MessageStrip的应用场景
- 527A. Playing with Paper