LinkedList - вставка между узлами без вставки - PullRequest
0 голосов
/ 17 ноября 2018

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

class Node(object):
    def __init__(self, data):
        self.data = data
        self.nextNode = None
'''
    def __str__(self):
      return str(self.data)
'''       
class LinkedList(object):
    def __init__(self):
        self.head = None
        self.tail = None


    # Insert inbetween
    def insert_in_between(self, data, prev_data):
      print("<<< INSERT INBETWEEN >>>")
      # instantiate the new node
      new_node = Node(data)
      print("This is new_node: ", new_node)
      # assign to head
      thisval = self.head
      print("This is thisval: ", thisval)
      print("This is prev_data: ", prev_data)
      # check each value in linked list against prev_data as long as value is not empty
      while thisval is not None:
        print("thisval is NOT NONE")
        print("in while loop, thisval = ", thisval)
        print("in while loop, prev_data = ", prev_data)
        # if value is equal to prev_data 
        if thisval == prev_data:
          print("thisval == prev_data")
          # make the next of new_node the prev_data's next
          new_node.nextNode = prev_data.nextNode
          # make the next of prev_data the new_node
          prev_data.nextNode = new_node
          break;
        # if value is not eqaul to prev_data then assign variable to next Node
        else:
          thisval = thisval.nextNode


    def push_from_head(self, NewVal):
      new_node = Node(NewVal)
      print("This is new_node: ", new_node.data)
      last = self.head
      print("This is last/HEAD: ", last)
      if self.head is None:
        print("Head is NONE")
        self.head = new_node
        print("This is self.head: ",self.head)
        return
      print("last.nextNode: ", last.nextNode)
      while last.nextNode is not None:
        print("this is last inside while loop: ", last.data)
        print("last.nextNode is not NONE")
        last = last.nextNode
        print("This is the last last: ", last.data)
      last.nextNode = new_node
      print("This is last.nextNode: ", last.nextNode)   


    def print_nodes(self):
        if self.head:
            thisval = self.head

            while thisval:
                print("This is node: ", thisval.data)
                thisval = thisval.nextNode

e1 = LinkedList()

e1.push_from_head(10)
e1.push_from_head(20)
e1.push_from_head(30)
e1.push_from_head(40)
e1.push_from_head(50)

e1.insert_in_between(25, 20)
e1.print_nodes() 
  • Хорошо, поэтому я хочу вставить узел (25) между 20 и30.
  • В моем методе insert_in_between я использую два аргумента: data и prev_data.Данных 25, но они становятся узлами, потому что я передаю их в класс узлов?Но prev_data - это int (20).
  • Я ожидал, что эта печать напечатает print("thisval == prev_data"), когда thisval == prev_data, но я думаю, что из-за несоответствия между узлами и целыми числами, эта оценка не будет иметь значение true.

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

РЕДАКТИРОВАТЬ

Когда я изменяю строку, как предложено: if thisval.data == prev_data: Я получаю ошибку: AttributeError: 'int'У объекта нет атрибута «nextNode», в котором он жалуется на эту строку: new_node.nextNode = prev_data.nextNode

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Приведенное выше предложение не совсем сработало. Мне пришлось добавить новый метод getNodes (), чтобы получить индекс узла, чтобы я мог вызвать его в своем методе insert_in_between.

class Node(object):
    def __init__(self, data):
        self.data = data
        self.nextNode = None

class LinkedList(object):
    def __init__(self):
        self.head = None
        self.tail = None

    def getNode(self, index):
      if self.head is not None:
        current = self.head
        count = 0
        while(current):
          if count == index:
            return current;
          else:
            count+=1
            current = current.nextNode
        else:
          print("There are no nodes")


    # Insert inbetween
    def insert_in_between(self, data, prev_data):
      print("<<< INSERT INBETWEEN >>>")
      # instantiate the new node
      new_node = Node(data)
      print("This is new_node: ", new_node)
      # assign to head
      thisval = self.head
      print("This is thisval: ", thisval)
      print("This is prev_data: ", prev_data)
      prev_node = self.getNode(1)
      print("This is prev_node: ", prev_node.data)
      # check each value in linked list against prev_data as long as value is not empty

      while thisval is not None:
        print("thisval is NOT NONE")
        print("in while loop, thisval = ", thisval)
        print("in while loop, prev_data = ", prev_data)

        # if value is equal to prev_node 
        if thisval.data == prev_node.data:
          print("thisval == prev_node")
          # make the next of new_node the prev_node's next
          new_node.nextNode = prev_node.nextNode
          # make the next of prev_node the new_node
          prev_node.nextNode = new_node
          break;
        # if value is not eqaul to prev_data then assign variable to next Node
        else:
          thisval = thisval.nextNode

    def push_from_head(self, NewVal):
      new_node = Node(NewVal)
      print("This is new_node: ", new_node.data)
      last = self.head
      print("This is last/HEAD: ", last)
      if self.head is None:
        print("Head is NONE")
        self.head = new_node
        print("This is self.head: ",self.head)
        return
      print("last.nextNode: ", last.nextNode)
      while last.nextNode is not None:
        print("this is last inside while loop: ", last.data)
        print("last.nextNode is not NONE")
        last = last.nextNode
        print("This is the last last: ", last.data)
      last.nextNode = new_node
      print("This is last.nextNode: ", last.nextNode)   


    def print_nodes(self):
        if self.head:
            thisval = self.head

            while thisval:
                print("This is node: ", thisval.data)
                thisval = thisval.nextNode

e1 = LinkedList()

e1.push_from_head(10)
e1.push_from_head(20)
e1.push_from_head(30)
e1.push_from_head(40)
e1.push_from_head(50)

e1.insert_in_between(25, 20)
e1.print_nodes()
0 голосов
/ 17 ноября 2018

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

if thisval.data == prev_data

При этом данные, хранящиеся в каждом объекте узла, будут сравниваться с введенным целочисленным значением (20) до тех пор, пока оно не будет найдено. В этом случае остальная часть вашего кода должна работать правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...