问题
一种特殊的链表节点类描述如下:
1 | public class Node { |
该类和正常节点拥有一样的功能,还新增了一个rand指针,可以指向链表钟的任意一个节点,也可以指向null。
请实现一个函数完成这个链表钟所有结构的复制,并返回复制的新链表的头节点。进阶:不用额外的数据结构,只用有限几个遍历,且再时间复杂度为O(N)内完成。
思路
第一眼看这题目可能会觉得很简单,直接遍历然后复制就好啦,其实不然,因为rand指针的存在,可能会随时去到较前的节点,所以需要记录之前的节点,这里提供两个方法。
方法一:
这里我们可以用哈希表,每一个原节点(key)都对应着一个复制节点(value)。把原节点作为key,复制节点作为value。遍历整个链表把每一个原节点,都复制了,再次遍历对复制节点的next和rand进行赋值(因为这时候我们全部节点都有了,你rand想指向哪里就指向哪里)
方法二:
本题的链表有rand指针,但本质上还是指向链表中的其中一个节点而已,只要我们能任意获得链表中的节点就可以了。
这里我们把链表进行一次遍历,让每一个原节点的next指向复制节点,复制节点的next指向原节点的next。这样就形成了一种变相的映射关系,原节点在前,复制节点在后。
随之我再次遍历链表、把复制节点的rand连上,最后再把复制节点分离出来即可。
实现
1 |
|
这里建议兄弟萌按照图,一点一点自己写,上面的代码仅供参考