繁体   English   中英

在 Python 中反转链表时的无限循环

[英]Infinite loop while reversing a linked list in Python

所以我有这个代码

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

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

  def prepend(self, data):
    new_node = Node(data)
    new_node.next = self.head
    self.head = new_node
    self.length += 1

  def print_list(self):
    if self.head == None:
      print('Empty')
    else:
      currentNode = self.head
      while currentNode != None:
        print(currentNode.data, end = ' ')
        currentNode = currentNode.next

  def reverse(self):
    first = self.head
    second = first.next
    while second:
        temp = second.next
        second.next = first
        first = second
        second = temp

我在前面加上一个 [8,7,11,6,5,10] 的列表。 当我尝试使用 reverse 函数并尝试打印出来时,我得到了 8 和 7 的无限循环。我不知道为什么。 我认为第一个已经指向 self.head,所以当它改变时,self.head 也会改变。 但事实并非如此。 有人可以帮我解决这个问题吗?

您的reverse方法仅关注前两个元素,并在它们之间设置循环引用。

这是修改后的reverse()方法,它有效。 (注意reverse()方法包含一个名为rev_()的封闭辅助函数,它通过链表递归):

def reverse (self):          #------------MODIFIED--------------
    def rev_ (head):
        rest = head.next
        if rest is None:
            return head
        else:
            reversed_rest = rev_(rest)
            rest.next = head
            head.next = None
            return reversed_rest
        if self.head is not None:
            self.head = rev_(self.head)

测试一下:

my_list = LinkedList()
my_list.print_list()
print()
my_list.reverse()
my_list.print_list()
print()
my_list.prepend(21)
my_list.print_list()
print()
my_list.reverse()
my_list.print_list()
print()
my_list.prepend(22)
my_list.prepend(23)
my_list.print_list()
print()
my_list.reverse()
my_list.print_list()

输出:

Empty

Empty

21 
21 
23 22 21 
21 22 23 

暂无
暂无

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

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