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.
class Node(object): def __init__(self, val, p=None, r=None): self.data = val self.next = p self.random = r def Creatlist(n): if n <= 0: return False if n == 1: return Node(1) else: root = Node(1) tmp = root for i in range(2, n + 1): tmp.next = Node(i) tmp = tmp.next return root def addRanodm(head): p = head while p.next and p.next.next: p.random = p.next.next p = p.next.next.next return head def printlist(head): p = head while p != None: if p.random: print [p.data, p.random.data] else: print [p.data] p = p.next class Solution(object): def copyList(self, head): if head is None: return head p = head while p is not None: newNode = Node(p.data) temp = p.next p.next = newNode newNode.next = temp p = temp p = head while p is not None: if p.random is not None: p.next.random = p.random.next p = p.next.next p = head newHead = head.next while p.next is not None: temp = p.next p.next = p.next.next p = temp return newHead head = addRanodm(Creatlist(8)) printlist(head) print "-------------------------" P = Solution() newhead = P.copyList(head) printlist(newhead)