请实现一个函数可以复制一个复杂链表。
在复杂链表中,每个结点除了有一个指针指向下一个结点外,还有一个额外的指针(随机指针)指向链表中的任意结点或者null。
注意:
- 函数结束后原链表要与输入时保持一致。
数据范围
链表长度 [0,500][0,500]。
解题思路:
(1)创建一个与原链表相同的链表,但是链表的每一个节点的随机指针设置为空
(2)遍历原链表,复制其随机指针到新建的链表(利用地址之间的差值来计算)
/**
* Definition for singly-linked list with a random pointer.
* struct ListNode {
* int val;
* struct ListNode *next;
* struct ListNode *random;
* };
*/
struct ListNode *copyRandomList(struct ListNode *head) {
if(!head)
return NULL;
struct ListNode *chead,*p,*q,*t;
chead=(struct ListNode *)malloc(sizeof(struct ListNode));
chead->val=head->val;
chead->random=NULL;
p=chead;
q=head->next;
while(q)
{
t=(struct ListNode *)malloc(sizeof(struct ListNode));
t->val=q->val;
t->random=NULL;
p->next=t;
p=t;
q=q->next;
}
p->next=NULL;
p=chead;
q=head;
while(q)
{
if(q->random)
p->random=p+(q->random-q); //q->random-q q->random与q的距离,也是p->random和p的距离
else
p->random=NULL;
p=p->next;
q=q->next;
}
return chead;
}