Leetcode: Copy List With Random Pointer分析理解

来源:互联网 发布:遗传算法求解步骤 编辑:程序博客网 时间:2024/06/06 01:04

题目大意:给定一个链表,链表中的每个节点除了含有next指针,还含有一个random指针,该指针指向链表中的任意节点或为NULL。求该链表的深拷贝。

分析:首先,说明一下深拷贝的含义。所谓深拷贝是指对需要拷贝的值,创建一个新的空间来保存这个值,当删除任何一个变量时,不会出错,因为他们的地址不同。进而可以联想到对应的浅拷贝,浅拷贝是指在对象复制时,只是对对象中的数据成员进行简单的复制,默认拷贝构造函数就是采用的浅拷贝,大多数情况下,浅拷贝已经可以很好的工作了,但是一旦对象存在了动态成员,浅拷贝就会出现问题。因为浅拷贝采取的是把一个变量中的数据地址直接赋值给另一个变量,删除其中任何一个变量,另一个变量中就没有了地址数据。(深拷贝和浅拷贝的详细分析参见:http://blog.csdn.net/bluescorpio/article/details/4322682)

深拷贝简单的理解就是创建出来一个值和原对象相同的对象。本题要考虑到random指针,它指向的对象的值也必须不能改变。

1. 在每个节点后插入一个自己的拷贝;

2. 设置新节点的random指针;

3. 将新链表和原始链表分离开来。返回新链表的头指针即可。

Java代码实现:

/** * Definition for singly-linked list with a random pointer. * class RandomListNode { *     int label; *     RandomListNode next, random; *     RandomListNode(int x) { this.label = x; } * }; */public class Solution {    public RandomListNode copyRandomList(RandomListNode head) {        if(head == null) return null;        RandomListNode res = null;        RandomListNode tmp;        RandomListNode p = head;        while(p != null) { //在每个节点后插入自己的拷贝            RandomListNode node = new RandomListNode(p.label);            tmp = p.next;            p.next = node;            node.next = tmp;            if(res == null) {                res = node;            }            p = tmp;        }        p = head;        while(p != null) { //设置新节点的random指针            tmp = p.next;            if(p.random != null) {                tmp.random = p.random.next;            }            p = tmp.next;        }        p = head;        tmp = res;        while(tmp.next != null) { //分离新链表和原始链表            p.next = tmp.next;            p = p.next;            tmp.next = p.next;            tmp = tmp.next;        }        p.next = null;        return res;    }}



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 珍爱网骚扰电话怎么办 打暑假工被骗怎么办 时时彩被骗了怎么办 急用钱逾期半年怎么办 征信花了急用钱怎么办 信用卡未通过审核怎么办 苹果想更新系统怎么办 用钱宝恶意骚扰怎么办 乐贷款登录不了怎么办 急需6000元怎么办黑户 信而富绑卡失败怎么办 回访电话说错了怎么办 乐贷款逾期一天怎么办 被贷款公司骚扰怎么办 趣店账户异常怎么办 指还王要还款下载不了怎么办 随心花账户异常怎么办 账号已被锁定怎么办 哈罗单车被警告怎么办 禁止安装拼多多怎么办 该用户行为异常怎么办 设备被禁止登录怎么办 你的设备被禁封怎么办 监控显示未配置怎么办 监控显示不在线怎么办 兔聊认证不通过怎么办 高考成绩被屏蔽怎么办 百合号码换了怎么办 微粒贷还款限额怎么办 秒白条扣款失败怎么办 信用卡逾期没还怎么办 催收发侮辱短信怎么办? 快贷还清后被拒怎么办 任信用还不起怎么办 信用飞额度抢光怎么办 装修工钱要不回怎么办 装修客户不给钱怎么办 公司赖账不给怎么办 欠钱不还还把我设置黑名单怎么办 别人欠钱留我电话怎么办 微贷审核不通过怎么办