título Descripción
Una lista de entrada compleja (cada nodo tiene un valor de nodo, y dos punteros, uno de puntero al siguiente nodo, un puntero especial a cualquier otro nodo), devuelve un valor después de la cabeza de la replicación lista compleja. (Tenga en cuenta que los resultados de salida no vuelven referencia de nodo de parámetros, de lo contrario el programa volverá preguntas condenados vacíos directamente)
La violencia para resolver:
Primera travesía de principio a fin, un nuevo puntero al azar para la lista vacía. todo lo que se mantuvieron en orden con los dos nodos en la lista dos listas.
Entonces atravesar de principio a fin, de acuerdo con una posición al azar en la lista original de la lista, la lista vinculada a la nueva referencia al azar impartir respectivos nodos.
class Solution:
# 返回 RandomListNode
def Clone(self, pHead):
if not pHead:
return None
node = RandomListNode(pHead.label)
head = node
pHead_s = pHead
nodes = [pHead]
nodes_copy = [node]
pHead = pHead.next
while pHead:
node.next = RandomListNode(pHead.label)
node = node.next
nodes.append(pHead)
nodes_copy.append(node)
pHead = pHead.next
head_s = head
while pHead_s:
if pHead_s.random:
head_s.random = nodes_copy[nodes.index(pHead_s.random)]
pHead_s = pHead_s.next
head_s = head_s.next
return head
optimización:
La complejidad de tiempo de la violencia de arriba es O (n ^ 2), la complejidad espacial es O (n)
Leer una respuesta en el ganado fuera, la complejidad de tiempo es O (n), la complejidad espacial es O (1)
class Solution:
def Clone(self, pHead):
pHead_s = pHead
while pHead_s:
temp = pHead_s.next
pHead_s.next = RandomListNode(pHead_s.label)
pHead_s.next.next = temp
pHead_s = pHead_s.next.next
pHead_s = pHead
while pHead_s:
if pHead_s.random:
pHead_s.next.random = pHead_s.random.next
pHead_s = pHead_s.next.next
pHead_s = pHead
head_s = pHead_s.next
head = head_s
while head_s.next:
pHead_s.next = pHead_s.next.next
head_s.next = head_s.next.next
pHead_s = pHead_s.next
head_s = head_s.next
return head