繁体   English   中英

使用递归时,单链表不会反向

[英]Singly linked list is not reversing when using recursion

我在弄清楚缺少的内容时遇到了麻烦。 我已经在线浏览了其他解决方案,当我应用这些差异时,这些解决方案似乎无效。 我花了很多时间尝试调试。 这是我的代码:

def recurse_reverse(self, curr, level):
    print('-' * level, 'curr:', curr.value, '| next:', curr.next.value if curr.next else curr.next)
    if (not curr) or (not curr.next): # if there's 0 or 1 node
        return curr

    # p = self.recurse_reverse(curr.next, level + 1)
    self.recurse_reverse(curr.next, level + 1)

    print('-' * level, 'curr:', curr.value, '->', curr.next.value, '->',
          curr.next.next.value if curr.next.next else curr.next.next)

    curr.next.next = curr
    # checking if pointer moved
    print('-' * level, 'curr:', curr.value, '->', curr.next.value, '->',
          curr.next.next.value if curr.next.next else curr.next.next)
    # curr.next = None
    # return p

我打电话时得到的输出

my_list = SinglyLinkedList()
my_list.add_to_tail(1)
my_list.add_to_tail(2)
my_list.add_to_tail(3)
my_list.add_to_tail(4)

print(my_list._head.value) # 1
print(my_list._head.next.value) # 2 
print(my_list._head.next.next.value) # 3
print(my_list._head.next.next.next.value) # 4

my_list.recurse_reverse(my_list._head, 1)

这是:

- curr: 1 | next: 2
-- curr: 2 | next: 3
--- curr: 3 | next: 4
---- curr: 4 | next: None
--- curr: 3 -> 4 -> None
--- curr: 3 -> 4 -> 3
-- curr: 2 -> 3 -> 4
-- curr: 2 -> 3 -> 2
- curr: 1 -> 2 -> 3
- curr: 1 -> 2 -> 1

因此,在每个级别进行打印,似乎指针都已正确移动。 但是,当我尝试打印链表的头部和尾部时,我分别调用recurse_reverse ,分别得到1和3。 但是,我期望的是4和1。

在我看到的许多解决方案中,代码的最后一行是curr.next = None ,以删除当前节点的next指针,但是当在我的代码中包含该指针时,我得到AttributeError: 'NoneType' object has no attribute 'value'

我也尝试过设定

p = self.recurse_reverse(curr.next, level + 1)

然后在最后一行return p ,但这也不起作用。

这是我的实现:

class _LinkNode:
    def __init__(self, value):
        self.value = value
        self.next = None

class SinglyLinkedList:
    def __init__(self):
        self._head = None
        self._tail = None
        self._length = 0

    def add_to_tail(self, value):
        """
        Add a new node to the tail of the linked list.

        Parameters
        ----------
        value : int, float, string, dict, list, etc.

        """
        new_node = _LinkNode(value)

        if self._head is None:  # if linked list is empty
            self._head = new_node

        if self._tail:  # if linked list has a tail, i.e. > 1 node
            self._tail.next = new_node

        self._tail = new_node  # regardless of current length, update tail

        self._length += 1

def recurse_reverse(self, curr, level):
    # see above

您的代码有两个问题。 首先,如果列表包含多个元素,则不交换_head.next ,在recurse_reverse之后,它仍将指向原始列表的第二个元素,因此反向列表的最后两个元素形成一个循环。第二个问题是您不_tail在代码中的任何地方交换_head_tail

这是一种递归实现逆转的方法:

@staticmethod
def reverse(prev, node):
    # Recurse until end of the list
    if node:
        SinglyLinkedList.reverse(node, node.next)
        node.next = prev

def recurse_reverse(self):
    # Reverse nodes
    SinglyLinkedList.reverse(None, self._head)

    # Swap head & tail since they are reversed now
    self._head, self._tail = self._tail, self._head

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM