复制带随机指针的链表 --java记录

给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。

要求返回这个链表的深拷贝。
在这里插入图片描述 `

输入:
{"$id":"1","next":{"$id":"2","next":null,"random":{"$ref":"2"},"val":2},"random":{"$ref":"2"},"val":1}

解释:
节点 1 的值是 1,它的下一个指针和随机指针都指向节点 2 。
节点 2 的值是 2,它的下一个指针指向 null,随机指针指向它自己。

提示:

你必须返回给定头的拷贝作为对克隆列表的引用。

解答
首先创建一个node1 相同的链表node2,这个链表将random先置空。
用map 存储 node1 节点与 node2 节点对应关系。
最后设置random:
node2.random 指向自己链表中节点可以通过map.get(node1.random)获取

class Solution {
    public Node copyRandomList(Node head) {
	       HashMap <Node,Node> map = new HashMap<Node,Node>();
	       Node node1 = head;
	       Node newhead = new Node();
	       Node node2 = newhead;
	       while(node1 != null) {//创建一个新链表
	    	   
	    	   Node temp = new Node(node1.val,null,null); //创建值与node1 相同的节点。
	    	   node2.next = temp;
	    	   map.put(node1, temp);   //将node1 节点与 node2中节点对应
	    	   node2 = node2.next;
	    	   node1 = node1.next;
	       }
	       node1 = head;
	       node2 = newhead.next;
	       while(node2 != null) {// 对node2  中的random 进行赋值,这个random是指向node2中的节点
	    	   
	    	   node2.random = map.get(node1.random);  //从map 中 拿出与node1 对应的node2
	    	   node1 = node1.next;
	    	   node2 = node2.next;
	       }
	       return newhead.next;
	    }
}

记录
另一种使用复制方法。1 2 3 变为 1 1 2 2 3 3。 根据前一个节点来设置后一个节点的random。
最后拆分为一个新链

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值