题目要求
解题思路
不得不说,大佬的代码对我这种小白来说就是一种恩赐啊。用的是哈希表进行操作的。
利用哈希表的查询特点,考虑构建 原链表节点 和 新链表对应节点 的键值对映射关系,再遍历构建新链表各节点的 next 和 random 引用指向即可。
算法流程:
若头节点head
为空节点,直接返回 null
;
初始化: 哈希表 dic , 节点 cur 指向头节点;
复制链表:
建立新节点,并向 dic 添加键值对 (原 cur 节点, 新 cur 节点) ;
cur 遍历至原链表下一节点;
构建新链表的引用指向:
构建新节点的 next 和 random 引用指向;
cur 遍历至原链表下一节点;
返回值: 新链表的头节点 dic[cur] ;
复杂度分析:
时间复杂度 O(N)O(N) : 两轮遍历链表,使用 O(N)O(N) 时间。
空间复杂度 O(N)O(N) : 哈希表 dic 使用线性大小的额外空间。
其实就是先复制一个普通的链表出来,然后通过map的方式找到next与random的位置,然后依次赋值给新节点的相应指针指向,最有意思的就是next和random复制的地方,要好好琢磨,有味道。
代码
1 | class Solution { |