2016-09-11 3 views
0

Я новичок программиста на питоне. Ниже приведено описание связанного списка в leetcode. У меня есть 2 вопроса для этой концепции, любая помощь будет оценена. Заранее спасибоpython linklist указатель и размер

# Definition for singly-linked list. 
# class ListNode(object): 
#  def __init__(self, x): 
#   self.val = x 
#   self.next = None 

Q1 Просто интересно, что тип «self.next», я знаю, в C++, он должен быть указатель, который представляет собой адрес следующего узла. Но у python нет такого типа, поэтому я смущен, какой тип «следующий».

Q2 Некоторые говорят мне, что это просто имя. Если это так, то я запускаю ниже код,

head =ListNode(1) 
print sys.getsizeof(head) 
head.next = ListNode(2) 
print sys.getsizeof(head) 

сначала head.next является «None», а затем ему присваивается другому типу ListNode, , но я получаю тот же размер головы до и после этого изменения, который, я думаю, размер головы должен быть больше, поскольку один из его членов (следующий) изменяется с типа None на тип ListNode. Я просто смущен, спасибо вам большое!

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

+0

Его питон вы можете назначить ему что угодно, но это должен быть тип 'Node', который имеет параметр' next' для работы списка. Вам лучше создать метод 'add' для класса списка, вместо того, чтобы явно добавлять в' .next'. Вы можете поместить туда проверку типа или в python 3.5+ есть понятие типов. Размер останется таким же, независимо от того, какой фактический узел является просто значением и ссылкой на следующий узел. Если вам нужно знать, сколько узлов вам нужно, перейдите по списку, чтобы подсчитать узлы или сохранить счет при добавлении узлов. –

+0

спасибо за разъяснение, и еще один вопрос о ссылке, если размер ссылки не изменился, почему у нас был бы другой размер для ссылки на int и ссылку списка, так как в этом случае они являются как ссылкой, так и что объект, на который они ссылаются, отличается. –

+0

Я не уверен на 100%, если честно. Но я знаю, что, хотя все в python является ссылкой. Значение int является неизменной ссылкой и поэтому копируется, когда его назначено (сродни прохождению по значению в C++), но встроенные списки «ListNode», dicts и т. Д. Являются изменяемой ссылкой и поэтому изменяются функцией, которую она передала (сродни неконстантной ссылке в C++). Эта семантическая разница может объяснять разницу в размере. [This] (http://stackoverflow.com/questions/6158907/what-does-python-treat-as-reference-types) вопрос может представлять интерес. –

ответ

0

Вопрос 1:

переменные Python динамически типизированный. (т. е. переменная может содержать int, а затем содержать список, а затем любой другой произвольный объект и т. д.).

В вашем случае Head.next начинается со ссылок, None a NoneType объект.

После того, как вы присвоите ему другое значение (ListNode(2)), Head.next теперь ссылается на недавно созданный объект ListNode.

Вопрос 2:

Почему не изменение размера. Я не являюсь экспертом в том, как работает python sys.getsizeof, но из того, что я могу собрать, является то, что List.next в обоих случаях является ссылочной переменной (т. Е. Переменной, которая ссылается на какой-то другой объект). Размер не изменяется, поскольку sys.getsizeof находит размер переменных объекта. Где Head.next - это просто ссылка на какой-то другой объект в обоих случаях.

См., How do I determine the size of an object in Python?, для получения более полных ответов о том, как работает sys.getsizeof.

+0

Большое вам спасибо! Так вы имели в виду, когда я, когда мы говорим о контрольной переменной, функция sizeof (Var1) получает размер ссылочной переменной it self, а не размер объекта, на который он указывает? –

+0

@MuheXie Да, это то, что я понял, прочитав об этом. –

0

Моя интерпретация связанного списка.

class LinkedList(object): 
    class Node(object): 
     def __init__(self, val=None, next=None, previous=None): 
      self.val = val 
      self.next = next 
      self.last = previous 

    def __init__(self): 
     self.length = 0 
     self.start = None 
     self.end = None 

    def append(self, value): 
     self.length += 1 
     if not self.start: 
      self.start = self.Node(value) 
     else: 
      if not self.end: 
       self.end = self.Node(value) 
       self.end.previous = self.start 
       self.end.next = self.start 
       self.start.next = self.end 
      else: 
       end = self.Node(value) 
       self.end.next = end 
       end.previous = self.end 
       self.end = end 
       self.end.next = self.start 

    def prepend(self, value): 
     self.length += 1 
     if not self.start: 
      self.start = self.Node(value) 
     else: 
      n = self.Node(value, self.start, self.end) 
      self.start.previous = n 
      self.start = n 

    def __len__(self): 
     return self.length 

    def __iter__(self): 
     self.position = 0 
     return self 

    def next(self): 
     self.position += 1 
     if self.position-1 >= len(self): 
      raise StopIteration 
     if self.position-1 == 0: 
      return self.start 
     cnt = 0 
     n = self.start 
     while cnt<self.position-1: 
      n = n.next 
      cnt += 1 
     return n 


    def __getitem__(self, index): 
     if index == 0: 
      return self.start 

     if index == -1: 
      return self.end 

     cnt = 0 
     n = self.start 
     while cnt<index+1: 
      n = n.next 
      cnt += 1 
     return n.val 

    def __repr__(self): 
     return repr(tuple(x.val for x in self)) 

l = LinkedList() 
l.append(4) 
l.append(5) 
l.append(3) 
l.prepend(0) 
print l 
print l[1] 
Смежные вопросы