此题本身其实并不难,难就难在——面试的高压环境下,你能想到吗?
不要害怕,冷静分析,心态放稳,相信你一定可以!
接下来请看题:力扣
分析:
题的大致意思就是说,让你复制一个和题目给出的相同链表,但是是深拷贝,同时每个结点还有一个随机的引用,所以就要小心,不是让你将next和random的值原封不动的照搬过来;
思路:
1.可以创建一个HashMap,通过遍历待拷贝链表,使待拷贝的结点引用与创建的新结点的结点的引用联系起来,同时将val值进行拷贝,假设如下图:
2.接下来让新链表的每个结点通过HashMap的一一对应关系连接起来,同时将random的连接起来,如下图:
3.提问:next的连接好理解,那么random使如何的连接呢?
通过HashMap表的对应关系,例如上图的新链表的第二个结点和第一个结点的连接:那么假设用来遍历的cur指向了待拷贝链表的第二个结点0x16,则不难想到hashMap.get(cur)是拿到了新链表的0x26处的结点,那么再深入一点,hashMap.get(cur.random)不就是找到新链表中的0x26结点的random该指向的结点了吗?(0x16结点处的random是0x12,0x12作为hashMap的key值,通过get就可以找到val值0x22,此时就找到了0x26结点处的random所因该指向的结点)
代码如下:
public Node copyRandomList(Node head) {
Node cur = head;
Map<Node, Node> hashMap = new HashMap<>();
/**
* 先遍历一遍链表,并创建新链表给val赋值
* 再给给hashMap分别赋值待被拷贝的链表结点地址和新创建的结点地址,使其对应起来
*/
while(cur != null){
Node node = new Node(cur.val);
hashMap.put(cur, node);
cur = cur.next;
}
//先让新链表连接起来,并把random赋给新结点
cur = head;
while(cur != null){
hashMap.get(cur).next = hashMap.get(cur.next);
hashMap.get(cur).random = hashMap.get(cur.random);
cur = cur.next;
}
return hashMap.get(head);
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/130458.html