解题思路:
/**
* Definition for a Node.
* struct Node {
* int val;
* struct Node *next;
* struct Node *random;
* };
*/
struct Node* copyRandomList(struct Node* head) {
struct Node* cur = head;
//1.将copy节点链接在原节点的后面。
while(cur)//定义局部变量*nextnode
{
struct Node* copynode = (struct Node*)malloc(sizeof(struct Node));
if(copynode == NULL)
{
perror("malloc fail");
return NULL;
}
copynode->val = cur->val;//copy val
struct Node* nextnode = cur->next;
//链接cur copynode nextnode
cur->next = copynode;
copynode->next = nextnode;
//移动cur
cur = nextnode;
}
//2.copy节点的random是原节点randomde->next
cur = head;
while(cur)//不定义局部变量*copynode
{
struct Node* copynode = cur->next;
if(cur->random == NULL)
{
copynode->random = NULL;
}
else
{
copynode->random = cur->random->next;
}
cur = cur->next->next;
}
//3.把copy节点从原链表解下来,并链接成一个新的链表,恢复原来的链表
struct Node* copyhead = NULL;
struct Node* copytail = NULL;
cur = head;
while(cur)
{
struct Node* copynode = cur->next;
struct Node* nextnode = copynode->next;
//copy尾插
if(copyhead == NULL)
{
copyhead = copytail = copynode;
}
else
{
copytail->next = copynode;
copytail = copytail->next;
}
//恢复原链表
cur->next = nextnode;
//cur向后走一步
cur = nextnode;
}
return copyhead;
}