链表复制

链表复制

48. 复杂链表的复刻

请实现一个函数可以复制一个复杂链表。

在复杂链表中,每个结点除了有一个指针指向下一个结点外,还有一个额外的指针指向链表中的任意结点或者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;
    }
};