目录
- 前言
- 1.随机链表的复制
- 1.1 思路
- 1.2 代码
- 总结
前言
这道题可谓是链表的试金石,涉及到链表的插入、删除,对代码能力是很大的考验。而且思路也很巧妙,很有价值的一道题。
1.随机链表的复制
138.随机链表的复制
1.1 思路
这个题目很难整的一点就是,如何处理random.
思路很巧妙的一点就是,将结点拷贝下来后,依次链接在原结点的后面(链表的插入),如下图,这样,如果cur->next不为NULL的话,就有copy->random=cur->random->next
,就是一个相对位置的设置很巧妙。遍历原链表,以处理复制链表的random.
接着将复制结点解下来(链表的删除),并恢复原链表。
1.2 代码
/**
* Definition for a Node.
* struct Node {
* int val;
* struct Node *next;
* struct Node *random;
* };
*/
struct Node* copyRandomList(struct Node* head) {
struct Node* cur=head,*next=NULL,*copy=NULL;
//将复制结点插入在对应结点后
while(cur)
{
copy=(struct Node*)malloc(sizeof(struct Node));
copy->val=cur->val;
next=cur->next;
//cur copy next
cur->next=copy;
copy->next=next;
cur=next;
}
//处理复制结点的random
cur=head;
while(cur)
{
copy=cur->next;
if(cur->random==NULL)
copy->random=NULL;
else
copy->random=cur->random->next;
cur=cur->next->next;
}
//将复制结点解下来,并恢复原链表
struct Node* newhead=NULL,*newTail=NULL;
cur=head;
while(cur)
{
copy=cur->next;
next=copy->next;
if(newTail==NULL)
newTail=newhead=copy;
else
{
newTail->next=copy;
newTail=newTail->next;
}
cur->next=next;
cur=next;
}
return newhead;
}
总结
这道题如果要求时间复杂度为O(n)的话,上面几乎是唯一解法;且在有思路的情况下,代码实现也需要一定能力。