思路:
1.创建新节点,插入到原链表中
2.修改random指针的指向
3.复制链表和原链表断开
代码:
/**
* Definition for a Node.
* struct Node {
* int val;
* struct Node *next;
* struct Node *random;
* };
*/
typedef struct Node Node;
//申请节点
Node* newBuyNode(int x)
{
Node* newnode = (Node*)malloc(sizeof(Node));
newnode->val = x;
newnode ->next = NULL;
newnode ->random = NULL;
return newnode;
}
//将申请的节点插入到原链表中
void AddNode(Node* head)
{
Node* pcur = head;
while(pcur)
{
Node* Next = pcur->next;
Node* newNode = newBuyNode(pcur->val);
pcur ->next = newNode;
newNode->next = Next;
pcur = Next;
}
}
struct Node* copyRandomList(struct Node* head) {
if(head == NULL)
{
return NULL;
}
//创建新的节点插入到原链表中
AddNode(head);
//修改random指针的指向
Node* pcur = head;
while(pcur)
{
Node* copy = pcur->next;
if(pcur->random)
copy->random = pcur->random->next;
pcur = copy ->next;
}
//复制链表和原链表断开
pcur = head;
Node* newHead,*newTail;
//newHead用来保存新的链表的第一个节点,newTail用来遍历新链表
newHead = newTail = pcur->next;
//当原链表的下一个节点为空的时候循环退出
while(pcur->next->next)
{
pcur = pcur->next->next;
newTail->next = pcur->next;
newTail = newTail->next;
}
return newHead;
}
提交结果:
v