随机指针链表指的是 链表的节点内包含两个指针,一个指向下一个节点,另一个指针指向随机节点。复制这种链表最大的难点就是关于随机指向指针的处理。其他指针或数值的复制直接拷贝就可以,但对随机指向指针在复制的时候很难找到随机指针指向的节点拷贝后的位置,假若你试图遍历整个数组去找随机指针指向的节点,这样会让效率低下,时间复杂度为O(N)
解决方法:
1.用插入节点的方式在源节点每一位的后面插入一个新的节点
(random的指向我就不画了)
把原来节点内部的数据放在新建的copy节点内部
2. copy->rand = cur -> rand -> next
用cur指针指向链表头部。新建的copy链表是你将要复制出来的链表,将数据保存在内部,这一部很关键,因为cur->rand->next就是新创建的原节点的rand对应的节点。
3.把新创建的copy链表解出来,并把原链表恢复
把新创建的链表节点连接起来,并把原链表的节点来连接起来,这样就得到了复制的链表copy
struct Node* copyRandomList(struct Node* head)
{
struct Node* Cur = head;
while(Cur)
{
struct Node* copy = (struct Node*)malloc(sizeof(struct Node));
copy -> val = Cur -> val;
copy -> next = Cur ->next;
Cur -> next = copy;
Cur = copy -> next;
}
Cur = head;
while(Cur)
{
struct Node* Copy = Cur -> next;
struct Node* next = Copy -> next;
if ((Cur -> random)== NULL)
{
Copy -> random = NULL;
}
else
{
Copy -> random = Cur -> random ->next;
}
Cur = next;
}
Cur = head;
struct Node* Copyhead = NULL,* Copytail = NULL;
while(Cur)
{
struct Node* Copy = Cur -> next;
struct Node* next = Copy -> next;
if (Copyhead == NULL)
{
Copytail = Copyhead = Copy;
}
else
{
Copytail -> next = Copy;
Copytail = Copytail -> next;
}
Cur -> next = next;
Cur = next;
}
return Copyhead;
}