复杂链表的复制

复杂链表的复制

http://www.nowcoder.com/questionTerminal/f836b2c43afc4b35ad6adc41ec941dba

看了前几个大佬的题解,感觉自己的挺容易理解的,具体注释应该能解释清楚

import java.util.HashMap;
public class Solution {
    public RandomListNode Clone(RandomListNode pHead) {
        if (pHead == null) return null;

        // target 作为将要返回的头,记住要new的
        RandomListNode target = new RandomListNode(pHead.label);
        // cur 获取链表头
        RandomListNode cur = pHead;
        // p   获取新链表头
        RandomListNode p = target;

        HashMap<randomlistnode, randomlistnode> map = new HashMap<>();

        // 由pHead将所有值存入map,每一个结点都要new的
        while (pHead != null) {
            map.put(pHead, new RandomListNode(pHead.label));
            pHead = pHead.next;
        }

        // target作为新链表的头,由cur,p移动来复制链表
        while (cur != null) {
            p.next = map.get( cur.next );
            p.random = map.get( cur.random );

            cur = cur.next;
            p = p.next;
        }

        return target;
    }
}

多谢评论区大佬指出,本代码有存在一定问题,暂时未修改。

全部评论
我觉得代码有点问题,头结点一开始new了一个newHead,然后和构造map的那个循环的第一次又对应了一个"newHead",两者不是同一个,会导致后面的节点如果原链random要指向了newHead的话会从map中取,而不是指向一开始new的那个
3
送花
回复
分享
发布于 2020-07-28 19:04
妙哉
1
送花
回复
分享
发布于 2020-04-04 02:13
滴滴
校招火热招聘中
官网直投
楼上代码有点小小的问题,改正如下: class Solution { public: RandomListNode* Clone(RandomListNode* pHead) { RandomListNode* ans = new RandomListNode(-1),*r = ans; RandomListNode *p = pHead; map<randomlistnode> mp; while(pHead){ mp[pHead] = new RandomListNode(pHead->label); //将所有节点的备份放入哈希表中 pHead = pHead->next; } while(p){ r->next = mp[p]; r->next->random = mp[p->random]; r = r->next; p = p->next; } r->next = nullptr; return ans->next; } };</randomlistnode>
1
送花
回复
分享
发布于 2020-08-09 11:25
就是搞不懂为什么非要用个map集合来存节点,直接赋new出来的值不行吗
点赞
送花
回复
分享
发布于 2020-04-04 10:48
为什么要返回target啊,不是应该返回p吗 萌新求解
点赞
送花
回复
分享
发布于 2020-04-08 10:32
在leetcode上不能ac啊
点赞
送花
回复
分享
发布于 2020-07-06 15:04

相关推荐

看网上风评也太差了
投递万得信息等公司8个岗位 >
点赞 评论 收藏
转发
40 3 评论
分享
牛客网
牛客企业服务