2017-02-05 6 views
-1

Вот основной пример связанного списка, который выглядит, как этотКак клонировать связанный список?

головы - нет> [4] -> [6] -> [8] -> Ни

class Node: 

    def __init__(self, data, next = None): 
     self.data = data 
     self.next = next 

class LL: 

    def __init__(self): 
     self.head = None 

    def insert_tail(self, o): 
     new_node = Node(o) 
     if self.head == None: 
      self.head = new_node 
     else: 
      current = self.head 
      while current.next != None: 
       current = current.next 
      current.next = new_node 

    def __str__(self): 
     result = '' 
     current = self.head 
     while current != None: 
      result = result + str(current.data) + ", " 
      current = current.next 
     return result[:-2] 




    def clone(self, empty): 
     '''(LL, NoneType) -> LL 
     ''' 
     empty = LL() 
     current = self.head 
     while current != None: 
      empty.insert_tail(None) 
      current = current.next 
     return empty 

a = LL() 
a.insert_tail(4) 
a.insert_tail(6) 
a.insert_tail(8) 
print(a) 

Мой вопрос, как мог бы я клонировать это без какого-либо изменения исходного связанного списка? О, и я не хочу использовать какие-либо встроенные структуры данных для этого, так как ни в одном списке, словарях, кортежах и т. Д. (Импорт не импортируется)

EDIT: я не хочу клонировать данные, я просто хочу, связанный список, как:

голова [] -> [] -> [] -> None (Это будет клон один из приведенных выше)

+0

Не могу поверить, что я забыл питон как тег, whoopsie – Ali89

+0

В качестве побочного примечания вы должны действительно назвать вас классом как «LinkedList» или что-то более наглядное. – Soviut

+0

@NPE мой метод клонирования - это то, что мне удалось – Ali89

ответ

0

Во-первых, список является неоптимальным. При реализации связанный список, вы должны:

  1. элементов вставки в начале списка, что является O(1)
  2. Если вы хотите поддержать вставки элементов в конце списка вы должны также следить за последний элемент список (таким образом, вставка будет O(1), а в вашем случае ее O(n)).

Для решения вашей проблемы вы можете воспользоваться следующим подходом: Создать пустой список и выполнить итерацию существующего. Для каждого элемента существующего списка просто добавьте его в конец нового списка.

+0

Совет должен содержаться в комментариях. ОП не спрашивал, как оптимизировать их реализацию. – Soviut

+0

Я havent начал Алгоритмы, но я не знаю, что вы подразумеваете под O (1). – Ali89

+0

@ Ali89 O (1) означает, что операция не зависит от длины списка (постоянная по времени). Обратите внимание, что в вашем случае, если у вас есть N элементов в списке, для добавления нового элемента потребуется перебрать весь список. Это означает, что эта операция O (N) во времени -> для этого требуется время, пропорциональное длине списка. – greenshade

0

Самый простой способ клонирования связанного списка состоит в том, чтобы ходить по списку, по элементам и создавать новый связанный список, когда вы вставляете новые элементы в хвост, как обычно. Создайте новый экземпляр класса LL, затем используйте метод insert_tail(), чтобы добавить элементы из списка, который вы клонируете.

Если вы надеетесь клонировать свой атрибут data, чтобы ваш клонированный список не взаимодействовал с оригиналом, вам придется использовать глубокое копирование в Python.

https://docs.python.org/2/library/copy.html

Стоит отметить, что это может быть просто проще использовать глубокую копию на весь связанный список, однако, ваш пробег может варьироваться в зависимости от того, что вы пытаетесь достичь.

+0

Я просто вана копировать указатели Мне все равно, что в данных. Я не знал, что они без перерывов, я сделал редактирование. – Ali89

+0

@ Ali89 Я дал ответ на это; Пройдите по списку, создайте новый с теми же методами, добавив к хвосту. Вы не хотите копировать указатели, вы хотите создать новые указатели; Скопированные указатели указывают на старые связанные элементы списка. – Soviut

+0

Здравствуйте. Если вы посмотрите на мой новый связанный список в редакторе, мой метод clone. Это верно? – Ali89

Смежные вопросы