给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。要求返回这个链表的深拷贝。链表为无头结点、单向、不循环。(由于涉及到结构体,所以写不了完整的测试代码,下面展示的代码为LeetCode中写的代码)

//第一次尝试:
//方法:借助原链表的结构来形成新链表,具体看图解:

//借助原来的结构,创建新的结构,再将其拆分出来,这样就解决了random指向不能确定的问题了;
struct
Node* copyRandomList(struct Node* head) { if(head == NULL){ return NULL; } struct Node* tail = head;
//在原链的基础上创建新的结点
while(tail){ struct Node* temp = tail->next;
//申请新的空间创建新节点
struct Node* node = (struct Node*)malloc(sizeof(struct Node));
//拷贝val数据 node
->val = tail->val; tail->next = node; node->next = temp; tail = temp; }
//确定新节点random的指向
struct Node* node = head; struct Node* cur = NULL; while(node){ cur = node->next;
//原结点的random指向不是NULL时
if(node->random){ cur->random = node->random->next; }
//原结点的random指向是NULL时
else{ cur->random = NULL; } node = cur->next; }
//拆分原链表和新链表
struct Node* p1 = head; struct Node* p2 = head->next; struct Node* p3 = NULL; struct Node* ret = p2; while(p2){ if(p2->next){ p3 = p2->next; p1->next = p3; p2->next = p3->next; p1 = p3; p2 = p1->next; }
//拆分时,最后两个结点拆分的情况和前面不一样,只需全部指向NULL即可
else{ p1->next = NULL; p2->next = NULL; p2 = p2->next; } } return ret; }