复制链表的复制
在复杂链表中,每个结点除了有一个next指针指向下一个结点之外,还有一个random指向链表中的任意结点或者NULL。
结点定义如下1
2
3
4
5
6typedef struct Link_C{
int data;
struct Link_C *next;
struct Link_C *random;
}Link_C;
思路:(我们分三步骤)
- 第一步:复制结点,将新结点连接在原结点后
- 第二步:复制random
- 第三步:拆分新旧结点
1 | typedef int DataType; |
为测试方便查看写了打印1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16void Print(Link_C *head)
{
Link_C *node = head;
while (node != NULL)
{
printf("[%d random(%p)->%d ] \n",
node->data,
node->random,
node->random ? node->random->data:0);
node = node->next;
}
printf("\n");
}
以下为测试部分1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29oid TestCopy()
{
Link_C *n1 = linkCreateNode(1);
Link_C *n2 = linkCreateNode(2);
Link_C *n3 = linkCreateNode(3);
Link_C *n4 = linkCreateNode(4);
Link_C *n5 = linkCreateNode(5);
Link_C *n6 = linkCreateNode(6);
Link_C *result;
n1->next = n2;
n2->next = n3;
n3->next = n4;
n4->next = n5;
n5->next = n6;
n1->random = n3;
n2->random = n6;
n3->random = n3;
n4->random = n4;
n5->random = n2;
Print(n1);
printf("\n----------------\n");
result = LinkCopy(n1);
Print(result);
}
测试结果就不在这里赘述了,有兴趣的伙伴可以自己尝试