[LintCode] 复制带随机指针的链表 Copy List with Random Pointer

来源:互联网 发布:捕鱼机核心算法 编辑:程序博客网 时间:2024/06/05 05:53

给出一个链表,每个节点包含一个额外增加的随机指针可以指向链表中的任何节点或空的节点。
返回一个深拷贝的链表。

挑战
可否使用O(1)的空间

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.

Challenge
Could you solve it with O(1) space?

思路参考:http://www.cppblog.com/yuech/archive/2011/04/02/143318.html

/** * Definition for singly-linked list with a random pointer. * class RandomListNode { *     int label; *     RandomListNode next, random; *     RandomListNode(int x) { this.label = x; } * }; */public class Solution {    /**     * @param head: The head of linked list with a random pointer.     * @return: A new head of a deep copy of the list.     */    public RandomListNode copyRandomList(RandomListNode head) {        RandomListNode p = head;        while(p != null) {//深拷贝节点            RandomListNode q = new RandomListNode(p.label);            q.next = p.next;            p.next = q;            p = q.next;        }        p = head;        while(p != null) {//复制随机链接            if(p.random != null)                p.next.random = p.random.next;            else                p.next.random = null;            p = p.next.next;        }        p = head;        RandomListNode q = head.next, result = head.next;        while(q.next != null) {//恢复原链表和深拷贝链表            p.next = q.next;            p = p.next;            q.next = p.next;            q = q.next;        }        return result;    }}
0 0