[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的复制节点。具体步骤如下:
  1.     根据next指针将链表copy一份,每个copy节点的random指针赋为null,并将形如<N,N'>的节点对保存到hashmap中;
  2.    通过<N,N'>键值对来确定复制节点的随机指针指向;


思路2:




具体分为三步:
  1. 以next节点为索引,对每个节点得到其复制节点,并添加到节点后面,如图中1;
  2. 确定各个复制节点的随机指针指向;
  3. 将复制的节点拆分出来组成新的的复制链表;

代码


思路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
原创粉丝点击