数据结构(7)单链表算法题OVA
随机链表的复制
1、题目描述
https://leetcode.cn/problems/copy-list-with-random-pointer
2、思路分析
第一步、在原链表的基础上拷贝节点
第二步、置random指针
只要节点不为空,那么就满足以下这个结论:copy -> random = cur -> random -> next
第三步、断开新旧链表
定义指针pcur指向原链表的头结点,用来遍历整个链表,再定义拷贝链表的头尾指针copyHead和copyTail。
3、参考代码
/*** Definition for a Node.* struct Node {* int val;* struct Node *next;* struct Node *random;* };*/
typedef struct Node Node;
Node* buyNode(int x)
{Node* newNode = (Node*)malloc(sizeof(Node));newNode->val = x;newNode->next = newNode->random = NULL;return newNode;
}
void AddNode(Node* head)
{Node* pcur = head;while(pcur){Node* newnode = buyNode(pcur->val);Node* next = pcur->next;newnode->next = next;pcur->next = newnode;pcur = next;}
}
void setRandom(Node* head)
{Node* pcur = head;while(pcur){Node* copy = pcur->next;if(pcur->random){copy->random = pcur->random->next;}pcur = copy->next;}
}
struct Node* copyRandomList(struct Node* head)
{if(head == NULL){return head;}//在原链表的基础上拷贝节点并插入到原链表中AddNode(head);//设置random指针setRandom(head);//断开新链表Node* pcur = head;Node* copyHead, *copyTail;copyHead = copyTail = pcur->next;while(copyTail->next){pcur = copyTail->next;copyTail->next = pcur->next; copyTail = copyTail->next;}return copyHead;
}