请实现一个函数可以复制一个复杂链表。
在复杂链表中,每个结点除了有一个指针指向下一个结点外,还有一个额外的指针指向链表中的任意结点或者null。
注意:
- 函数结束后原链表要与输入时保持一致。
/** * Definition for singly-linked list with a random pointer. * struct ListNode { * int val; * ListNode *next, *random; * ListNode(int x) : val(x), next(NULL), random(NULL) {} * }; */ class Solution { public: ListNode *copyRandomList(ListNode *head) { auto p = head; //第一次遍历,每个节点后面复制一个节点 while(p){ auto t = new ListNode(p->val); t->next = p->next; p->next = t; p = t->next; } p = head; //第二次遍历,为复制的节点接上random指针 while(p){ if(p->random){ //下面这句要理解 p->next->random = p->random->next; } p = p->next->next; } auto newh = new ListNode(-1); auto cur = newh; p = head; //第三次遍历,将复制的节点与原节点分离; while(p){ cur->next = p->next; cur = cur->next; p->next = p->next->next; p = p->next; } return newh->next; } };