《剑指 offer 》面试题 35:复杂链表的复制

一、题目描述

请实现函数 complex_list_node *clone_list(complex_list_node *head),复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的随机节点或 nullptr 。节点的 C++定义如下:

如下是一个复杂链表示例,其中虚线是 random 指针:

二、思路

复制过程可以分为三步,第一步,复制链表中的所有节点并插入到对应节点后,random 指针和原节点指针保持一致:

第二步,修改所有复制节点的 random 指针,修改成被复制出来的节点:

第三步,把所有新复制出来的节点从原始链表中移除:

三、代码实现

链表节点定义:

第一步克隆所有节点函数:

第二步修改 random 指针指向:

第三步分离原始链表和新克隆链表:

整合起来的复杂链表拷贝函数:

注意:这个函数里面一定要判断 head 是否为空的情况,前面三个函数因为是内部函数所以没有在入口判断 head 为空的情况!

四、单元测试

写代码容易,写单元测试麻烦,一个单元测试写了一小时。。。

4.1 链表创建函数

做单元测试,必不可少的一个测试函数是链表创建函数,因为要测试链表,首先要先创建链表:

测试这个函数的正确性:

4.1 测试功能

测试功能点:

  1. 空链表测试
  2. 非空链表测试
  3. 链表克隆后是否会影响原始链表

leetcode 上也有这个一模一样的题目,下面的测试数据是基于 leetcode 来写的。

https://leetcode-cn.com/problems/copy-list-with-random-pointer/submissions/

TestFixtures 定义:

测试克隆链表案例:

测试空链表复制:

测试是否修改了原链表:

测试结果:

发表评论