复杂链表的复制
复杂链表的复制
https://www.nowcoder.com/practice/f836b2c43afc4b35ad6adc41ec941dba?tpId=13&&tqId=11178&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
浅拷贝就是两者共用一份内存地址,一个改变,另外一个跟着改变;深拷贝就是两者的内存地址是不一样的,互相独立的。
那么我们要怎么进行深拷贝呢?
肯定不可以直接将节点赋值给新的节点,这样就是引用了。所以我想到的是新建节点,然后新节点的值跟原来的节点的一样。
但是要怎么存储呢?因为我们深拷贝的新的链表,每一个节点都是跟原来链表一一对应的,但是是互相独立的,所以我就想到了HashMap,它不就是存储k-v键值对的吗,这样不就可以将两个节点一一对应起来。(这里的一一对应的意思是,知道哪个是哪个的深拷贝节点)
接着,我们还需要将新链表中的每个节点赋上next,random属性的值,那么我们就可以通过hashmap,通过key(原链表的节点),取出拷贝的节点,然后将这个key(旧节点)的两个属性值拷贝给新节点,这样不就很完美吗!
所以这道题就是看能不能想到用hashmap来解决了,当你想到的时候,那么一切问题将会变得非常的简单
public RandomListNode Clone(RandomListNode pHead) { HashMap<RandomListNode, RandomListNode> map = new HashMap<RandomListNode,RandomListNode>(); RandomListNode p = pHead; //第一次遍历,新建立节点 while(p != null){ RandomListNode newNode = new RandomListNode(p.label); map.put(p,newNode); p = p.next; } p = pHead; //第二遍遍历 赋值对应的关系 while(p != null){ RandomListNode node = map.get(p); node.next = (p.next==null)?null:map.get(p.next); node.random = (p.random==null)?null:map.get(p.random); p = p.next; } return map.get(pHead); }
剑指offer 文章被收录于专栏
为刷过的每一道题都书写一篇题解,便于重复练习~