2012-01-23 9 views
4

Я пытаюсь связать связанный список Python, не копируя данные, содержащиеся в узлах списка. У меня есть функция, которая объединит список, используя копии узлов, которые были переданы, но я не могу получить функцию, которая не использует копии для работы.Связанный с Python Связанный список

Эти функции предназначены для целей тестирования и синхронизации; Я знаю, что встроенный список Python потрясающий!

Вот класс, с которым я работал, и функцию конкатенации.

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

def print_list(self): 
    node = self 
    while node != None: 
     print node.data 
     node = node.next 

Функция конкатенации не должна быть функцией-членом класса Cell.

def list_concat(A, B): 
    while A.next != None: 
     A = A.next 
    A.next = B  
    return A 

Эта функция перезаписывает первый элемент списка, если параметр A имеет более одного узла. Я понимаю, почему это происходит, но я не уверен, как это сделать.

Вот код тестирования, который я использовал для этой функции.

e = Cell(5) 
test = Cell(3, Cell(4)) 
test2 = list_concat(test2, e) 
test2.print_list() 

Любое понимание или помощь были бы весьма полезными.

* отредактирован, чтобы исправить форматирование кода

+0

Ваша функция конкатенации должна работать. Обратите внимание, что 'list' не является связанным списком. Я бы предположил, что вы смотрите на реализации Lisp, поскольку они используют ячейки той же структуры, что и вы. – Marcin

+0

Я думал, что эта реализация также должна работать, однако, когда я печатаю список (test2), он перечисляет элементы как 4 -> 5 -> None, когда он должен отображать 3 -> 4 -> 5 -> None. –

+0

Обратите внимание, что в вашем примере кода вы используете test2 как параметр перед назначением ему. – Marcin

ответ

5

Попробуйте вместо этого:

def list_concat(A, B): 
    current = A 
    while current.next != None: 
     current = current.next 
    current.next = B 
    return A 

Присвоение новых значений параметров функция, является плохой практикой программирования, а код в ваш вопрос показывает, почему: Вы использовали A для итерации по исходному списку, и тем самым вы потеряли ссылку на свой первый элемент.

+1

Другая возможность - просто разбить часть «найти конец списка» на отдельную функцию, которая возвращает последний узел. Тогда это 'list_concat (A, B): find_end (A) .next = B; return A' – kindall

+1

Или, мне стыдно, что я только что подумал о нем, * не возвращайте список вообще *, как встроенный класс 'list' Python. – kindall

0

Я не уверен на поводу, если extend выполняет копирование или нет, но в случае, если это не так, просто используйте

A.extend(B) 
+0

Извините, я пропустил ту часть, где вы сказали, что делаете это для тестирования – Chris

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