Как напрямую ссылаться на объект через переменную в Python - PullRequest
0 голосов
/ 16 сентября 2018

По сути, я реализую класс LinkedList, а затем реализую различные методы для его использования. Ниже приведен код для класса LinkedList (и его зависимого класса Node)

# A simple linked list implementation

class Node:
# attributes:
#   data (can be anything)
#   next (another Node)

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


class LinkedList:
# attributes:
#   head (a Node)
# ****************
# methods:
#   insert
#   find
#   delete

    def __init__(self):
        self.head = None

    def __str__(self):
        output = []
        current_node = self.head
        while current_node:
            output.append(str(current_node.data))
            current_node = current_node.next
        return(", ".join(output))


    # Creates a Node with the given data and inserts into the front of the list.
    def insert(self, data):
        new_node = Node(data)
        new_node.next = self.head
        self.head = new_node

    # Finds the first node with the given data. Returns None if there is no such node.
    def find(self, data):
        current_node = self.head
        while(current_node):
            if (current_node.data == data):
                return current_node
            current_node = current_node.next
        return None # We reached the end of the list without finding anything.

    # Deletes given node. Can be used in conjunction with find.
    def delete(self, deleted_node):
        if deleted_node == self.head:
            self.head = self.head.next
            return
        current_node = self.head
        while(current_node.next != deleted_node):
            current_node = current_node.next
        current_node.next = deleted_node.next

Затем я пытаюсь реализовать функцию поворота (my_list, N), которая будет, ну, в общем, вращать my_list на N. Ниже приведен мой код:

import linkedlists as ll
from ErrorHandler import sanitize
import random, math, time, copy

def length(my_list):
    sanitize(my_list, ll.LinkedList)
    if my_list.head == None: return 0
    count = 1 #First item! Ah, ah, ah
    current_node = my_list.head
    while current_node.next != None:
        current_node = current_node.next
        count += 1 #One more item! Ah, ah, ah
    return count

def get_Nth(my_list, N):
    sanitize(my_list, ll.LinkedList)
    if my_list.head == None: return None
    current_node = my_list.head
    count = 0
    while current_node.next != None:
        if count == N:
            return current_node
        count +=1
        current_node = current_node.next
    return current_node

def rotate(my_list, N):
    sanitize(my_list, ll.LinkedList)
    if my_list.head == None: return None
    N = N % length(my_list)
    lent = length(my_list)
    get_Nth(my_list, lent-1).next = my_list.head
    my_list.head = get_Nth(my_list, lent-N)
    get_Nth(my_list, lent-N-1).next = None

Однако вызов rotate () для LinkedList, содержащего числа от 0 до 9 в порядке возрастания, возвращает 8,9,0,1,2,3,4,5. Зачем? Я почти уверен, что это имеет отношение к третьим и вторым по последним строкам, потому что при присваивании get_Nth (my_list, lent-1) .next my_list.head он указывает только на my_list.head вместо Объект узла my_list.head указывает на время.

Как я могу это исправить?

1 Ответ

0 голосов
/ 16 сентября 2018

Ваша ошибка здесь: get_Nth(my_list, lent-N-1).next = None

Я предполагаю, что вы позвонили rotate(my_list, 2), поэтому на данный момент список выглядит следующим образом [8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, ...].Поэтому, когда вы называете get_Nth(my_list, lent-N-1), lent-N-1 равно 7, ну, элемент индекса 7 фактически равен 5.

Вы должны просто использовать lent-1.

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