• 138. Copy List with Random Pointer


    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.

    常规解法:

    必须先遍历一遍复制single linked list。遍历过程中建立一个1对1的map,copy的每个node都是以之前node为key的pair的value。这样在第二次遍历的时候,只需要将random赋值就好。

    public RandomListNode CopyRandomList(RandomListNode head) {
            if(head == null) return null;
            RandomListNode nextNode = null;
            var sentinel = new RandomListNode(-1);
            sentinel.next = head;
            var sentinel2 = new RandomListNode(-1);
            var dummy = sentinel2;
            var hashtable  = new Dictionary<RandomListNode,RandomListNode>();
            //copy;
            while(head != null)
            {
                var newCopy = new RandomListNode(head.label);
                hashtable.Add(head,newCopy);
                sentinel2.next = newCopy;
                head = head.next;
                sentinel2 = sentinel2.next;
            }
            //copy random
            var newHead = sentinel.next;
            var newListHead =  dummy.next;
            while(newHead != null)
            {
                var random = newHead.random;
                newListHead.random =(random==null)?null: hashtable[random];
                newHead = newHead.next;
                newListHead = newListHead.next;
            }
           
            return dummy.next;
        }

    网上有大神http://fisherlei.blogspot.com/2013/11/leetcode-copy-list-with-random-pointer.html 给出了很巧妙的方法。

    public RandomListNode CopyRandomList(RandomListNode head) {
            if(head == null) return null;
            RandomListNode nextNode = null;
            var sentinel = new RandomListNode(-1);
            sentinel.next = head;
            //copy;
            while(head != null)
            {
                var newCopy = new RandomListNode(head.label);
                nextNode = head.next;
                head.next = newCopy;
                newCopy.next = nextNode;
                head = nextNode;
            }
            //copy random
            var newHead = sentinel.next;
            while(newHead != null)
            {
                var random = newHead.random;
                var follow = newHead.next;
                follow.random =(random==null)? null:random.next;
                newHead = follow.next;
            }
            //split into 2 lists
            var legacy = sentinel.next;
            var pilot = new RandomListNode(-1);
            var dummy = pilot;
            while(legacy != null)
            {
                pilot.next = legacy.next;
                pilot =  pilot.next;
                legacy.next = legacy.next.next ;
                legacy = legacy.next;
            }
            return dummy.next;
        }
  • 相关阅读:
    OBS直播和相关操作
    计算机信息安全易错题目整理3
    计算机信息安全易错题目整理1
    LeetCode SQL题目(第一弹)
    操作系统及安全复习笔记
    网络安全web部分
    《算法分析与设计基础》考前复习提纲
    兼容新旧浏览器的flex写法
    特效背景粒子插件particles.js
    前端工程师必备的几个实用网站
  • 原文地址:https://www.cnblogs.com/renyualbert/p/5867728.html
Copyright © 2020-2023  润新知