一、题目要求
二、解题思路
1、在每个结点后插入一个和此结点值相等的新结点。然后给新结点的随机指针赋值,画图就可以看出,旧结点随机指针不指向空时,新结点的随机指针应该指向旧结点随机指针指向的结点的下一个结点。如图:
2、用三个指针将链表分割,让cur指向tail,然后三个指针依次向后移动一位。注意循环停止条件。
如图:
三、代码
typedef struct Node Node;
struct Node* copyRandomList(struct Node* head) {
//链表为空时返回空
if(head == NULL){
return NULL;
}
Node* cur = head;
//在每一个原结点后插入一个值相同的新结点
while(cur){
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->val = cur->val;
newNode->next = cur->next;
cur->next = newNode;
cur = newNode->next;
}
Node* old = head;
Node* new = old->next;
//给新结点的每一个随机指针赋值
while(1){
if(old->random == NULL){
//旧结点随机指针指向空的话,新结点的随机指针也指向空
new->random = NULL;
}else{
//画图就可以看出,旧结点随机指针不指向空时,新结点
//的随机指针应该指向旧结点随机指针指向的结点的下一个
//结点
new->random = old->random->next;
}
old = new->next;
//注意循环停止条件
if(old == NULL){
break;
}
new = old->next;
}
Node* cur1 = head;
Node* cur2 = head->next;
Node* tail = head->next->next;
Node* newhead = cur2;
//用三个指针分割新链表和旧链表
while(1){
cur1->next = tail;
cur1 = cur2;
cur2 = tail;
//注意循环停止条件
if(cur2 == NULL){
break;
}
tail = tail->next;
}
//新链表最后一个结点指向空
cur1->next = NULL;
return newhead;
}
注意:两个循环把停止条件放在循环里面是因为防止指针越界