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

以非递归方式反转链表

廖鸿达
2023-03-14

请检查下面的反转功能。剩下的代码应该没问题。由于某种原因,该函数没有反转双链接列表。

#!/bin/python3
import math
import os
import random
import re
import sys

双链表节点结构

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

双链表结构

class DoublyLinkedList:
    def __init__(self):
        self.head = None
        self.tail = None

    def insert_node(self, node_data):
        node = DoublyLinkedListNode(node_data)

        if not self.head:
            self.head = node
        else:
            self.tail.next = node
            node.prev = self.tail
            self.tail = node

按从头部到尾部的顺序排列。

def print_doubly_linked_list(node, sep, fptr):
    while node:
        fptr.write(str(node.data))

        node = node.next

        if node:
            fptr.write(sep)

请检查下面的反向函数,因为此函数不会返回反向双链接列表。检查是否有任何错误并让我知道。

def reverse(head):
    if head == None:
        return head
    temp = None    
    curr = head
    while(curr is not None):
        temp = curr.prev
        curr.prev = curr.next
        curr.next= temp
        curr = curr.next
    if temp is not None:
        head = temp.prev
    return head




if __name__ == '__main__':
    fptr = open(os.environ['OUTPUT_PATH'], 'w')

    t = int(input())

    for t_itr in range(t):
        llist_count = int(input())

        llist = DoublyLinkedList()

        for _ in range(llist_count):
            llist_item = int(input())
            llist.insert_node(llist_item)

        llist1 = reverse(llist.head)

        print_doubly_linked_list(llist1, ' ', fptr)
        fptr.write('\n')

    fptr.close()

共有1个答案

郭乐意
2023-03-14

您开始从标题开始反转列表,该标题没有prev项,因此while循环中打断。相反,从尾部反转应该:

llist1 = reverse(llist.tail)

一般来说,我认为你的函数reverse应该把整个列表(而不是头部或尾部)作为参数,然后根据其中的项目构建一个全新的DoublyLinkedList。这还可以解决与变量名之间的混淆,其中llistDoublyLinkedList,而llist1DoublyLinkedListNode

编辑:我忘了,在insert_node中,您还应该制作self。tail=节点如果还没有头节点/第一个节点。

 类似资料:
  • 我做了一个使用递归方法反转单链表的函数。然而,我在执行下面的代码时遇到了一些困难: 我应该如何在ReverseCursive函数/方法中传递第二个参数,以便执行它? 作为第二个参数,我想简单地传递链表的头节点。但是我不知道如何从类的init方法中获取头节点linked_list 我试了几件事,但都解决不了。也许我不太擅长OOP概念。有人能帮我解决这个问题吗?

  • 问题内容: 我已经在一个类的Java项目上工作了一段时间。它是链表(此处称为,包含称为的简单节点)的实现。问题是,一切都必须使用递归算法来完成。我可以用一种方法来做所有的事情: 现在,我的函数只是调用一个带有参数以允许递归的辅助函数。 我的助手功能具有的签名。 目前,我使用堆栈来迭代工作,但这不是规范所要求的。我在C语言中找到了一种算法,该算法可以递归地将其递归逆转并将其转换为Java代码,并且可

  • 本文向大家介绍单链表反转 递归法Java实现相关面试题,主要包含被问及单链表反转 递归法Java实现时的应答技巧和注意事项,需要的朋友参考一下 经历了很多面试,面试官最爱考察的算法无非是斐波那契数列和单链表反转,尽管是这些都是基础知识,然而我对单链表反转有更多的想法。 递归法是我早期最爱在面试中使用的算法,很有逼格,写起来非常优雅,非常好理解。 先定义链表数据结构 如上代码所示 递归法会逐层确定该

  • 我有脚本谁搜索最近的搜索号码。例如,假设数组中有以下数字: '0' = '0.25' = '0.75'= '1' = 我正在寻找0.50的差点,所以0.25和0.75在0.50的相同范围内。 在这种情况下,我想得到更大的数值,在这个例子中是0.75。 有效的代码是: 我知道我可以在这里使用递归,但我没有使用递归的经验。我知道我需要这样称呼它: 但即使我转储函数输出,也会得到空白页。

  • 还缺少的是将最后一个节点的next赋值为NULL。 在任何世界里,像这样的东西会起作用吗?它给出了一个运行时/分段错误。