博客园  :: 首页  :: 新随笔  :: 订阅 订阅  :: 管理

LeetCode【138】Copy List with Random Pointer

Posted on 2015-05-11 22:17  NUST小文  阅读(113)  评论(0编辑  收藏  举报

A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.

Return a deep copy of the list.

看上去比较复杂,实际上也比普通的链表题复杂。两个思路,一个用hash表,存储旧地址和新地址,然后对应一一copy;第二个思路,就和剑指offer里面提到的那样,在每个节点后创建一个副本,假设为copy,则在拷贝random指针时相对简单了。copy->random等于源节点的random指针的next节点。实现如下,已AC:

RandomListNode *copyRandomList(RandomListNode *head) {
        if(!head)
            return head;
        // head is not NULL
        RandomListNode* h=head;
        //copy nodes and next pointers;
        while(h)
        {
            RandomListNode* copy = new RandomListNode(h->label);
            copy->next = h->next;
            h->next = copy;
            h=copy->next;
        }
        
        //copy random pointers
        h=head;
        while(h)
        {
            if(h->random)
                h->next->random = h->random->next;
            h=h->next->next;
        }
        //split
        h=head;
        RandomListNode* newHead=head->next;
        while(h)
        {   
            RandomListNode* newH= h->next;
            h->next = newH->next;
            h=newH->next;
            if(h)
                newH->next = h->next;
            else
                newH->next = h;
        }
        return newHead;
    }