LeetCode(138) Copy List with Random Pointer
题目
A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.
Return a deep copy of the list.
分析
实现一个链表的深拷贝,返回拷贝后的新链表。
若是普通链表,逐个拷贝原始链表节点并连接即可,只需O(n)的时间复杂度;但是此题特殊的是,每个节点都有一个random域可以指向该链表中的任何一个节点,所以直接复制无法处理random域,因为其指向的节点很有可能还没有创建出来。
有两种方法处理: 
方法一:暴力解决,首先不处理random域,将原始链表复制一份,然后遍历每个原始链表节点,查找其random域,将新链表的对应节点链接,该方法需要O(n^2)的时间复杂度,给出的结果是TLE。
方法二:充分利用原始链表的信息,不用保存原始链表的映射关系,构建新节点时,指针做如下变化,即把新节点插入到相应的旧节点后面(参考):
 
同理分两步
1、构建新节点random指针:
new1->random = old1->random->next, new2-random = NULL,
new3-random = NULL, new4->random = old4->random->next2、恢复原始链表以及构建新链表:
old1->next = old1->next->next,  new1->next = new1->next->next该算法时间复杂度O(N),空间复杂度O(1)
AC代码
class Solution {
public:
    //方法一:直接复制,再修改random指针
    RandomListNode *copyRandomList1(RandomListNode *head) {
        if (!head)
            return NULL;
        RandomListNode *ret = new RandomListNode(head->label), *q = ret;
        RandomListNode *p = head->next;
        while (p)
        {
            RandomListNode *tmp = new RandomListNode(p->label);
            q->next = tmp;
            q = q->next;
            p = p->next;
        }//while
        q->next = NULL;
        //处理原始链表的random指针
        p = head, q = ret;
        RandomListNode *idx1 = head, *idx2 = ret;
        while (p)
        {
            if (p->random == NULL)
                q->random = NULL;
            else{
                idx1 = head;
                idx2 = ret;
                while (p->random->label != idx1->label)
                {
                    idx1 = idx1->next;
                    idx2 = idx2->next;
                }//while
                q->random = idx2;
            }//else
            p = p->next;
            q = q->next;
        }//while
        return ret;
    }
    //方法二:充分利用原始链表信息,在每个节点后复制添加
    RandomListNode *copyRandomList(RandomListNode *head) {
        if (!head)
            return NULL;
        //首先,复制原始的节点,连接自身后面
        RandomListNode *p = head;
        while (p)
        {
            RandomListNode *tmp = new RandomListNode(p->label);
            //保存后续节点
            RandomListNode *r = p->next;
            tmp->next = r;
            p->next = tmp;
            p = r;
        }//while
        //然后,将添加的节点random 链接到原始节点random的下一个位置
        p = head;
        while (p)
        {
            RandomListNode *q = p->next;
            if (p->random == NULL)
                q->random = NULL;
            else{
                q->random = p->random->next;
            }//else
            //处理下一个原始节点
            p = q->next;
        }//while
        //最后,恢复原始链表,得到新链表
        RandomListNode *ret = head->next;
        p = head;
        RandomListNode *q = head->next;
        while (q->next)
        {
            p->next = q->next;
            p = q;
            if (q->next)
                q = q->next;
        }
        p->next = NULL;
        q->next = NULL;
        return ret;
    }
};LeetCode(138) Copy List with Random Pointer的更多相关文章
- 133. Clone Graph 138. Copy List with Random Pointer  拷贝图和链表
		133. Clone Graph Clone an undirected graph. Each node in the graph contains a label and a list of it ... 
- 【LeetCode练习题】Copy List with Random Pointer
		Copy List with Random Pointer A linked list is given such that each node contains an additional rand ... 
- [Leetcode Week17]Copy List with Random Pointer
		Copy List with Random Pointer 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/copy-list-with-random- ... 
- LeetCode(275)H-Index II
		题目 Follow up for H-Index: What if the citations array is sorted in ascending order? Could you optimi ... 
- LeetCode(220) Contains Duplicate III
		题目 Given an array of integers, find out whether there are two distinct indices i and j in the array ... 
- LeetCode(154) Find Minimum in Rotated Sorted Array II
		题目 Follow up for "Find Minimum in Rotated Sorted Array": What if duplicates are allowed? W ... 
- LeetCode(122)  Best Time to Buy and Sell Stock II
		题目 Say you have an array for which the ith element is the price of a given stock on day i. Design an ... 
- LeetCode(116) Populating Next Right Pointers in Each Node
		题目 Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode * ... 
- LeetCode(113) Path Sum II
		题目 Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given ... 
随机推荐
- 《java学习三》并发编程   -------线程池原理剖析
			阻塞队列与非阻塞队 阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞.试图从空的阻塞队列中获取元素的线程将会被阻塞,直到 ... 
- UI2_同步下载
			// // ViewController.m // UI2_同步下载 // // Created by zhangxueming on 15/7/17. // Copyright (c) 2015年 ... 
- Collections集合工具类,集合嵌套,集合综合案例斗地主
			1 Collections集合工具类 (可以对比Arrays工具类共同记忆) 常用方法: 例: import java.util.ArrayList; import java.util.Collect ... 
- CSS布局技巧之——各种居中
			居中是我们使用css来布局时常遇到的情况.使用css来进行居中时,有时一个属性就能搞定,有时则需要一定的技巧才能兼容到所有浏览器,本文就居中的一些常用方法做个简单的介绍. 注:本文所讲方法除了特别说明 ... 
- js中.toString()和String()的一丢丢区别
			1..toString()可以将所有的的数据都转换为字符串,但是要排除null 和 undefined 例如将false转为字符串类型 <script> var str = false ... 
- win7双网卡走哪个网卡路由设置
			有没有软件能做这个我还真不知道.说说我的做法吧: 单位里无线是可以访问Internet的,有线是用来访问公司内部系统的. 默认的54M无线网络和100M的有线网络,系统在选择默认路由的时候肯定是选择有 ... 
- 一键部署WordPress开源内容管理系统
			https://market.azure.cn/Vhd/Show?vhdId=9857&version=10889 产品详情 产品介绍WordPress是一款个人博客系统,并逐步演化成一款内容 ... 
- UWP开发:应用文件存储
			应用设置由于数据量和数据类型的限制,有很大的局限性,所以还需要应用文件存储,以文件的方式存储数据.在每个应用的应用数据存储中,该应用拥有系统定义的根目录:一个用于本地文件,一个用于漫游文件,还有一个用 ... 
- HDU - 5457  Hold Your Hand (Trie + 最小割)
			Hold Your Hand Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 65535/102400 K (Java/Others)T ... 
- [dp]uestc oj 邱老师看电影
			定义状态dp[w][b]表示有w只白老鼠,b只黑老鼠时妹子赢的概率,分两种情况妹子抓到白老鼠概率为w/(w+b)和否则只有妹子抓黑老鼠和邱老师抓黑老鼠妹子才可能赢,再分两种情况:酱神抓白老鼠,状态 ... 
