[LeetCode]Copy List with Random Pointer
来源:互联网 发布:高分一号卫星数据下载 编辑:程序博客网 时间:2024/04/30 11:59
题目描述
A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.
Return a deep copy of the list.
一个随机链表的每个节点包括一个纸箱下一个节点的指针和一个指向链表中随机节点或空的指针。将这个随机链表copy一份。解题思路
本题的关键点是如何定位复制节点的随机指针指向哪个复制节点。
思路1:
使用HashMap来保存节点对<N,N'>,其中N表示原链表中的节点,N'表示N的复制节点。具体步骤如下:
- 根据next指针将链表copy一份,每个copy节点的random指针赋为null,并将形如<N,N'>的节点对保存到hashmap中;
- 通过<N,N'>键值对来确定复制节点的随机指针指向;
思路2:
具体分为三步:
- 以next节点为索引,对每个节点得到其复制节点,并添加到节点后面,如图中1;
- 确定各个复制节点的随机指针指向;
- 将复制的节点拆分出来组成新的的复制链表;
代码
思路1代码:
public static RandomListNode copyRandomList(RandomListNode head) {RandomListNode newHead;RandomListNode loopNode;RandomListNode copyLoopNode, lastCopyLoopNode = null;HashMap<RandomListNode, RandomListNode> map = new HashMap<RandomListNode, RandomListNode>();if (head == null) {return null;}newHead = new RandomListNode(head.label);// 以next指针为线索复制一份新的链表for (loopNode = head; loopNode != null; loopNode = loopNode.next) {copyLoopNode = new RandomListNode(loopNode.label);copyLoopNode.random = null;copyLoopNode.next = null;if (loopNode == head) {newHead = copyLoopNode;lastCopyLoopNode = copyLoopNode;} else {lastCopyLoopNode.next = copyLoopNode;lastCopyLoopNode = copyLoopNode;}// <key,value> = <node,copyNode>存储到hashmap中map.put(loopNode, copyLoopNode);}loopNode = head;copyLoopNode = newHead;// 复制随机指针while (loopNode != null) {if (loopNode.random != null) {// 通过key = node,获取value = copyNodecopyLoopNode.random = map.get(loopNode.random);}loopNode = loopNode.next;copyLoopNode = copyLoopNode.next;}return newHead;}
思路2代码:
public static RandomListNode copyRandomList(RandomListNode head) {RandomListNode newHead = null;RandomListNode loopNode;RandomListNode copyLoopNode,lastCopyLoopNode = null;if (head == null) {return null;}newHead = new RandomListNode(head.label);loopNode = head;// 将链表ABCDEDG....变为AA'BB'CC'DD'EE'FF'GG'.....的新链表while (loopNode != null) {copyLoopNode = new RandomListNode(loopNode.label);copyLoopNode.random = null;copyLoopNode.next = loopNode.next;loopNode.next = copyLoopNode;loopNode = copyLoopNode.next;}loopNode = head;// 复制随机指针while (loopNode != null) {if (loopNode.random != null) {loopNode.next.random = loopNode.random.next;}loopNode = loopNode.next.next;}loopNode = head;//拆分链表while (loopNode != null) {copyLoopNode = loopNode.next;loopNode.next = copyLoopNode.next;if(loopNode==head){newHead = copyLoopNode;lastCopyLoopNode = newHead;} else {lastCopyLoopNode.next = copyLoopNode;lastCopyLoopNode = copyLoopNode;}loopNode = loopNode.next;}return newHead;}
0 0
- [leetcode][list] Copy List with Random Pointer
- Leetcode: Copy List with Random Pointer
- LeetCode: Copy List with Random Pointer
- [LeetCode] Copy List with Random Pointer
- [leetcode]Copy List with Random Pointer
- LeetCode:Copy List with Random Pointer
- leetcode Copy List with Random Pointer
- LeetCode:Copy List with Random Pointer
- LeetCode题解:Copy List with Random Pointer
- [LeetCode]Copy List with Random Pointer
- leetcode Copy List with Random Pointer
- leetcode-Copy List with Random Pointer
- Leetcode: Copy List with Random Pointer
- LeetCode | Copy List with Random Pointer
- [LeetCode] Copy List with Random Pointer
- LeetCode OJ:Copy List with Random Pointer
- LeetCode(138)Copy List with Random Pointer
- [LeetCode] - Copy List with Random Pointer
- 越丑越美白的养颜食物
- L1范数
- 重装win7系统必须知道的一些事
- c#中yield的用法详解
- runloop学习
- [LeetCode]Copy List with Random Pointer
- FregClient和FregServer进程间通信
- Performing User-Managed Database-18.4、Restoring Datafiles and Archived Redo Logs
- 负载均衡
- 【Android开发】解决不同的OnClickListener冲突的问题
- 来自你的不知道的新球
- 关于web中js乱码
- 第七周作业——背包算法
- Airplay 教程: 一个 Apple TV 多人竞答游戏(2)