前言
我们常见的链表中一般有3种类型的指针:指向下一个节点、指向上一个节点、尾节点指向头节点。在复杂链表中,每个节点除了拥有指向下一个节点的指针外,还会有一个指针用于指向链表中的任意节点或者null。本文就跟大家分享下如何复制一个复杂链表,欢迎各位感兴趣的开发者阅读本文。
实现思路
相信大多数看到这个问题的第一反应是把这个复制过程分成两步:
- 遍历原始链表,复制每个节点。
- 为复制链表设置每个节点的sibling指针。
假设原始链表中某个节点N的sibling指针指向节点S,由于S在链表中可能在N的前面也可能在N的后面。所以要定位S的位置就需要从原始链表的头节点开始找。
如果从头节点开始沿着next指针经过s步找到了了节点S,那么在复制链表上节点N’的sibling指针离复制链表的头节点的距离也是沿着next指针走s步。用这种方法我们就可以为复制链表上的每个节点设置sibling指针。
(如下图所示:节点1与节点2的sibling指针设置过程)。
那么,对于一个含有n个节点的链表,定位每个节点的sibling指针都需要从链表头节点开始经过O(n)
步才能找到,因此这种方法总的时间复杂度是O(n^2)
。
经过观察后,上述方法的时间主要花费在定位节点的sibling指针上,这一部分能否优化