zoukankan      html  css  js  c++  java
  • Leetcode 138. 复制带随机指针的链表

    1.题目要求

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

    要求返回这个链表的深度拷贝。 

    2.解题思路

    (1)笔试思路(求速度,拿分数):使用哈希表

    /**
     * Definition for singly-linked list with a random pointer.
     * struct RandomListNode {
     *     int label;
     *     RandomListNode *next, *random;
     *     RandomListNode(int x) : label(x), next(NULL), random(NULL) {}
     * };
     */
    class Solution {
    public:
        RandomListNode *copyRandomList(RandomListNode *head) {
            /*(一对一的)哈希表map 空间O(n)*/
            
            //判空
            if(head == NULL) return NULL;
            
            //复制原链表,创建一个新链表,整个过程中两个链表是平行的,通过哈希表关联起来
            map<RandomListNode*,RandomListNode*> map;
            RandomListNode* cur = head;
            
            //创建和原链表一样的结点,利用哈希表建立原链表结点和拷贝结点的一一对应关系
            while(cur!= NULL)
            {
                RandomListNode* copy_cur = new RandomListNode(cur->label) ;
                map[cur]=copy_cur;//下标功能强大,支持任意类型,不只是int
                cur = cur->next;
            }
            
            //重新遍历一次链表,复制next和random关系       
            cur = head;//回到表头
            while(cur != NULL)
            {
                map[cur]->next= map[cur->next];
                map[cur]->random = map[cur->random];
                cur = cur->next;
            }
            return map[head];//返回拷贝的新链表的表头
        }
    };
    
    
        

    (2)面试思路(秀思维分析能力):不适用哈希表,将空间复杂度降低到O(1)。

     

    例如:1——>2——>3
    利用下面的这个链接结构省略hash表,建立原链表结点与拷贝的新链表结点的一一对应关系。
    1——>1'——>2——>2'——>3——>3'
    
    例如:1-next->2(原表上),由1-next->2-next->2',即可令1'-next->2'
    
    例如:1-random->3(原表上),由1-random->3-next->3',即可令1'-random->3'
    
    最后将两个链表分离出来即可,返回新链表的头结点。
  • 相关阅读:
    STM32的DMA
    STM32 入门之 GPIO (zhuan)
    CRC校验码 代码
    actan函数 查表法
    UART 和 USART 的区别
    STM32的NVIC理解
    STM32_adc
    STM 32 can 实例代码
    在Visual C#中调用API的基本过程
    贴片电阻阻值标识
  • 原文地址:https://www.cnblogs.com/paulprayer/p/9909407.html
Copyright © 2011-2022 走看看