剑指Offer-数据结构 35. 复杂链表的复制
Q:请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。
eg:
输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]
如果是复制一个普通的单链表,那很简单,依次创建节点,并设置next的指向,但是这里的单链表有一个random指针,复制的时候要指向的位置都还没有创建,怎么办?
-
一、哈希表法:
最容易想到的办法就是哈希表法,建立一个原链表和新链表的节点对应关系,那原链表对应的next和random也就对应了。
比如:原链表第2个节点13 的next指向节点11,random指向节点7。那建立新的节点后,新的节点13的next指向就是新的节点11,random指向就是新的节点7。
所以步骤就是
1、先创建新链表的各个节点并利用哈希表保存新链表个节点的对应关系。
2、根据哈希表保存的对应关系修改新链表的next和random指向。
由于C标准库并没提供hash表的功能,可以使用