向后打印不起作用的Python双向链表

问题描述 投票:0回答:2

我正在学习链表,我正在创建双向链表。我的向后打印未按预期工作。为了获得更好的信息,我将突出显示向后打印功能。


向后打印

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


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

    def get_last_node(self):
        itr = self.head
        while itr.next:
            itr = itr.next
        return itr

        def print_backward(self):
        if self.head is None:
            print("Linked List is empty")
            return
        last = self.get_last_node()
        itr = last
        llstr = ''
        while itr:
            llstr += itr.data + '-->'
            itr = itr.prev
        print(llstr)

我希望我的代码能够得到解决...

python loops oop linked-list doubly-linked-list
2个回答
0
投票

当您修复缩进问题并确保

node.data
在打印之前转换为字符串时,您的链接列表似乎按预期工作。否则,我认为初始化列表可能有问题

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


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

    def get_last_node(self):
        itr = self.head
        while itr.next:
            itr = itr.next
        return itr

    def print_backward(self):
        if self.head is None:
            print("Linked List is empty")
            return
        last = self.get_last_node()
        itr = last
        llstr = ''
        while itr:
            llstr += str(itr.data) + '-->'
            itr = itr.prev
        print(llstr)


# Sample test
lst = LinkedList()

nodes = [Node(data=x) for x in range(10)]

nodes[0].next = nodes[1]

for i in range(1, 9):
    nodes[i].prev = nodes[i - 1]
    nodes[i].next = nodes[i + 1]

nodes[-1].prev = nodes[-2]

lst.head = nodes[0]

lst.print_backward()
# Output: 9-->8-->7-->6-->5-->4-->3-->2-->1-->0-->

0
投票

使用双向链表,您通常需要前置和附加功能。

重写 Node 类中的 __str__ 以便于打印。

使用生成器按顺序或反向生成节点。

类似这样的:

class Node:
    def __init__(self, _data):
        self._data = _data
        self._next = self._prev = None

    def __str__(self):
        return f"{self._data}"


class LinkedList:
    def __init__(self):
        self._head = None
        self._tail = None

    def append(self, _node):
        _node._prev = self._tail
        _node._next = None
        if self._tail:
            self._tail._next = _node
            self._tail = _node
        else:
            self._head = self._tail = _node

    def prepend(self, _node):
        _node._next = self._head
        _node._prev = None
        if self._head:
            self._head._prev = _node
            self._head = _node
        else:
            self._head = self._tail = _node

    def nodes(self, reverse=False):
        if reverse:
            temp = self._tail
            while temp:
                yield temp
                temp = temp._prev
        else:
            temp = self._head
            while temp:
                yield temp
                temp = temp._next


LL = LinkedList()

LL.append(Node(3))
LL.append(Node(4))
LL.append(Node(5))
LL.prepend(Node(2))
LL.prepend(Node(1))

print('Reversed:')
print(*LL.nodes(reverse=True), sep='-->')
print('Normal:')
print(*LL.nodes(), sep='-->')

输出:

Reversed:
5-->4-->3-->2-->1
Normal:
1-->2-->3-->4-->5
© www.soinside.com 2019 - 2024. All rights reserved.