【问题标题】:Why this code for Linked List is showing error in HackerRank?为什么这个链表代码在 HackerRank 中显示错误?
【发布时间】:2018-01-23 15:34:07
【问题描述】:

我已经在 IDLE 中用这段代码实现了链表。如果我遍历它会显示预期的输出。但是在hackerrank中我遇到了麻烦。我错过了什么? 这是问题link

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

    def get_data(self):
        return self.data
    def get_next(self):
        return self.next_node
    def set_next(self,new_next):
        self.next_node = new_next
class LL:
    def __init__(self,head=None,tail=None):
       self.head = head   #head
       self.tail = tail   #tail
    def Insert(self,data):
        new_node =  Node(data) #new_node
        new_node.set_next(None)

        if self.head == None:

            self.head = new_node
            self.tail = new_node
        else:
            self.tail.set_next(new_node)
            self.tail = new_node

【问题讨论】:

  • 最后 6 行没有任何意义。您希望头部和尾部看起来像什么?
  • 我认为您应该使用示例代码中为您的语言提供的 Node 类。测试代码似乎依赖于某些属性的存在,比如node.next
  • 插入功能在哪里?根据需要返回链表的头部在哪里?
  • 程序的第一行应该是def Insert(node, data):,不是class Node,当然也不是class LL,并且该函数应该返回一些东西。
  • 如果不了解需要什么,就不可能提供解决方案,即使是一个简单的问题。 Hackerrank 应该对此进行评估,而您未能“在以下(插入)方法中返回列表的头部”

标签: python data-structures linked-list


【解决方案1】:

python 中的 getter 和 setter 是多余的。另外,你把事情复杂化了。

您只需要担心两种情况;一般情况,head 时的极端情况是None

解决方案 1
迭代

def Insert(head, data):
    # handle the corner case
    if not head:
        return Node(data)

    # handle the general case
    temp = head
    while temp.next:
        temp = temp.next
    temp.next = Node(data)

    return head

解决方案 2
递归

def Insert(head, data):
    if not head:
        return Node(data)

    head.next = Insert(head.next, data)
    return head

这两种解决方案都通过了 Hackerrank 上的所有测试用例。

【讨论】:

  • 感谢您的回答。其实我在看到讨论后也尝试过这种方式。但是,可能是我的理论知识让我一头雾水!用这种方式在IDLE中写代码,如何遍历列表?
  • @carl 坚持问题中的节点定义。从那里开始。此代码适用于 Hackerrank 中的骨架代码。首先了解它在做什么,然后在您完全了解正在发生的事情后尝试它。
  • @carl 对,还有一件事。如果答案有用,请考虑投票,marking it accepted。谢谢!
【解决方案2】:

在您的代码中self.tail.set_next(new_node) 显示错误,因为set_nextNode 类的函数,您可以通过Node object 访问此函数

试试这个

class Node:

   def __init__(self,data,nextNode=None):
       self.data = data
       self.nextNode = nextNode

   def getData(self):
       return self.data

   def setData(self,val):
       self.data = val

   def getNextNode(self):
       return self.nextNode

   def setNextNode(self,val):
       self.nextNode = val

class LinkedList:

   def __init__(self,head = None):
       self.head = head
       self.size = 0

   def getSize(self):
       return self.size

   def addNode(self,data):
       newNode = Node(data,self.head)
       self.head = newNode
       self.size+=1
       return True

   def printNode(self):
       curr = self.head
       while curr:
           print(curr.data)
           curr = curr.getNextNode()

myList = LinkedList()
print("Inserting")
print(myList.addNode(5))
print(myList.addNode(15))
print(myList.addNode(25))
print("Printing")
myList.printNode()
print("Size")
print(myList.getSize())

它的数据结构是这样的

【讨论】:

    猜你喜欢
    • 2018-05-09
    • 2016-08-09
    • 2017-11-25
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    相关资源
    最近更新 更多