当前位置: 首页 > 知识库问答 >
问题:

为什么这不能给出一个输出,而内核正在运行,就好像它在某个循环下一样?

姜嘉赐
2023-03-14

学习如何制作链表?如果可能,请提供更好的解决方案。添加了push、insertafter、printlist和append函数。学习如何制作链表?如果可能,请提供更好的解决方案。添加了push、insertafter、printlist和append函数。

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

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

    def push(self,new_data):
        new_node = Node(new_data)
        new_node.next = self.head
        self.head = new_node
    def insertAfter(self,prev_node,new_data):
        if prev_node is None:
            print('Enter valid previous node data')
            return
        new_node = Node(new_data)
        new_node.next = prev_node.next
        prev_node.next = new_data

    def append(self,new_data):
        new_node= Node(new_data)
        if self.head is None:
            self.head = new_node
        last = self.head
        #while last.next!= None:
            #temp = last.next
            #last =temp.next
        while last.next:
            last = last.next
        last.next = new_node

    def printList(self):
        temp = self.head
        while temp:
            print(temp.data)
            temp = temp.next

if __name__ =='__main__':
    llist = LinkedList()
    llist.append(7)
    llist.append(8)
    llist.push(5)
    llist.insertAfter(Node(5),6)
    llist.printList()

共有2个答案

袁霍英
2023-03-14

问题出在append方法中。附加第一个节点时,self。head为无,因此执行:

self。头=新节点

但是接下来,您继续尝试寻找最后一个节点,在这种情况下,它也将最终成为self.head

        last = self.head
        #while last.next!= None:
            #temp = last.next
            #last =temp.next
        while last.next:
            last = last.next

因此,执行此行时:

last.nextnew_node

您正在有效地设置新节点。next=new_node,这会导致对append的下一个调用进入无限循环

邢飞昂
2023-03-14

修复方法:

def append(self,new_data):
    new_node= Node(new_data)
    if self.head is None:
        self.head = new_node
        return  # <- this is the fix
    ...

如果没有这个返回语句,您将转到这个新添加的节点,并将其. Next分配给它自己。通过这个循环引用,下一个. append()进入无限循环

 类似资料:
  • 问题内容: 我在编写Traveling Salesman程序时遇到了这个问题。对于内部循环,我尝试了 但是在该列表中添加另一个点时会导致被抛出。 但是,当我将循环更改为 循环运行良好,没有引发异常。 这两个都是for循环,那么为什么一个抛出异常却另一个没有抛出异常呢? 问题答案: 正如其他人解释的那样,迭代器检测到对基础集合的修改,这是一件好事,因为它可能会导致意外的行为。 想象一下下面的无迭代器

  • 问题内容: 我想做的是请用户输入一些字符串以读入数组,然后要求用户输入该数量的字符串并将其读入数组。当我运行此代码时,它从不要求我在第一个for循环的第一个循环中输入内容,只打印出“字符串#0:字符串#1:”,然后我就可以输入文本了。为什么会这样,我做错了什么? 问题答案: 缓冲。 输入输入数量时,不会在输入缓冲区中占用换行符的位置。在for循环的迭代0中,缓冲区中已经有一行输入,并且可以立即完成

  • 当用户键入以下内容的答案时:system.out.println(“键入数字”); 它不会继续到我的代码的下一部分。

  • 因此,作为学校的一部分,我正在使用For循环,我有一些代码可以工作,但我很难理解为什么它可以工作。对我来说,重要的是要真正理解为什么一块代码能做它不能做的事情,而不仅仅是它能工作。 所以有一点背景。这个小程序利用for循环,根据用户输入打印一系列字符。其思想是用户输入一个介于1和8之间的数字,程序将打印一个字符,然后移动到下一行再打印两个,移动到下一行再打印三个等等,并打印用户输入的行数。 程序在

  • 我发现这样的php代码: 我希望这个循环会执行4次,因为$I变成了对$的引用(对吗?)。然而,循环只执行一次,并输出: a=10,i=10 我不明白为什么它会这样工作。有什么想法吗?

  • 小白菜疑问,能不能详细地跟我说一下两种写法的区别? 题目:使用函数求素数和: 定义prime(p), 其中函数prime当用户传入参数p为素数时返回True,否则返回False 定义PrimeSum(m,n),函数PrimeSum返回区间[m, n]内所有素数的和。题目保证用户传入的参数1<=m<n 假设输入m=1,n=10 疑问:下面是两种不同的写法,第一个是我写的,第二个是正确答案TT,我不太