Leetcode042--链表的深度拷贝

来源:互联网 发布:xcode windows能用吗 编辑:程序博客网 时间:2024/06/01 18:20

一、原题



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.



一、中文



链表的每个元素不仅有指向下一个结点的指针,还包括了一个随机的指针,对这样的链表进行一个深度的拷贝



三、举例



先来区分一个深拷贝和浅拷贝吧,浅拷贝是拷贝一引用,而深拷贝拷贝的不仅仅是引用,还包括引用所属的值,简单的说就说拷贝另一份



四、思路



(1)新建一个链表的头结点,建立以HashMap,将新老结点以键值对的方式存储在Map中

(2)然后遍历原来链表,根据它复制新的结点,也是以键值对的方式存储在Map中

(3)最后再从头遍历,将Random的指针进行赋值,注意random指针必须得在链表建立的基础之上才可以,要不没办法指向

Random的指向拷贝以Map的形式可能不好理解,其实random也就是next.next...的形式,也是复制的next,这样就理解了



五、程序


程序如下:


/** * Definition for singly-linked list with a random pointer. * class RandomListNode { *     int label; *     RandomListNode next, random; *     RandomListNode(int x) { this.label = x; } * }; */import java.util.*;public class Solution {    public RandomListNode copyRandomList(RandomListNode head) {        if(head == null){            return head;        }                //新建一个链表的头结点        RandomListNode newHead = new RandomListNode(head.label);        RandomListNode oldp = head.next;        RandomListNode newp=newHead;        Map<RandomListNode,RandomListNode> map = new HashMap<RandomListNode,RandomListNode>();                map.put(newp, head);                //对旧链表进行复制        while(oldp != null){            RandomListNode temp = new RandomListNode(oldp.label);            map.put(temp, oldp);            newp.next = temp;            newp = newp.next;            oldp = oldp.next;        }                //将Random指针进行复制        newp = newHead;        oldp = head;        while(newp != null){            //这里的random指针相当于有几个next比较好理解            newp.random = map.get(newp).random;            newp = newp.next;            oldp = oldp.next;        }        return newHead;    }}





1 0
原创粉丝点击