2016-09-22 92 views
0

代码片段如下:试图颠倒我的节点列表,但是当我这样做时,只有一个节点(链接列表中的第一个)打印。任何想法我在这里做错了吗?我已经写在纸上,它似乎应该循环通过我的节点,将每个添加到我的新链接列表? newList.head.next = temp:问题的如何反转我在Python中的单节点链表节点?

# node class 
class Node(object): 
    def __init__(self, value, next=None): 
     self.value = value 
     self.next = next 

# singly linked list class 
class SinglyLinkedList(object): 
    def __init__(self): 
     self.head = None 
     self.tail = None 

# I'm trying to do the same thing in my reverseList() method 
# as I'm doing in the addFront method 
def addFront(self, value): 
    # create new node 
    newNode = Node(value) 
    # set old head to point to new node 
    if self.head == None: 
     self.head = newNode 
     self.tail = newNode 
    else: 
     # store old head 
     last_head = self.head 
     # set head to new node 
     self.head = newNode 
     # point head to old head 
     self.head.next = last_head 

# reverseList() method not working? 
# Only giving me first head value? Why? 
def reverseList(self): 
     node = self.head 
     newList = SinglyLinkedList() 
     newList.head = None 
     while node: 
      if node.next == None: 
       break 
      else: 
       temp = newList.head 
       newList.head = node 
       newList.head.next = temp 
       print newList.head.value 
       node = node.next 

回答

1

看来,你的代码是跳跃列表的最后一个元素,由于在设置node == node.next,然后询问是否node.next有一个值。您的新列表还重用了现有列表的节点,这些列表会导致它们共享该对象。这不可能是所期望的行为,因为对一个列表的节点进行的任何更改都会导致对其他列表的更改。特别是如果你添加新的元素给他们其中之一,你会开始体验到你的列表表现奇怪。

以下代码创建一个新列表,其中包含原始列表的值按相反顺序排列。

def revers(self): 
    rev = SinglyLinkedList() 
    node = self.head 

    while node: 
     newNode = Node(node.value) 
     if not rev.tail: 
      rev.tail = newNode 
     newNode.next = rev.head 
     rev.head = newNode 
     node = node.next 

    return rev 

以下代码反转列表。

def revers(self): 
    prev = self.head 
    next = self.head.next 
    prev.next = None 

    while next: 
     temp = next.next 
     next.next = prev 
     prev = next 
     next = temp 

    self.head, self.tail = self.tail, self.head 

关于您的代码的评论。混合功能性和命令性行为通常是一个糟糕的主意。您的addFront函数修改列表对象,而您要求创建新列表的反向函数。你所有的函数都应该创建一个新的列表,或者修改当前的实例。像这样混合使得很难预测列表的行为。

+0

我不能要求更强大的反馈,非常感谢你所描述的所有内容,我现在明白你对功能/命令行为的看法 - 我试图找到这个解决方案,这是我走进势在必行的土地,但你已经完成了(扭转现有的名单)是恒星和我正在寻找的确切解决方案。接受答复并且您的反馈和贡献受到极大的重视! – natureminded

0

部分与newList.head = node分配,随后发生。第一行使这两个引用指向相同的东西,下一行现在将改变它们(因为它们现在可以互换使用)。

我认为你需要以前的头分配给您的新名单的尾巴,当您去:

def reverseList(self): 
    node = self.head 
    newList = SinglyLinkedList() 
    newList.head = None 
    while node: 
     if node.next == None: 
      break 
     else: 
      temp = newList.head 
      newList.head = node 
      newList.tail = temp 
      print newList.head.value 
      node = node.next 

编辑:如果你不介意创建新节点(对象)只包含旧节点对象的值(这是我认为addFront是做),你应该能够简单地替换:

newList.head = node 

newList.head = Node(node.value, node.next) 

在您原来的帖子

+0

我很欣赏这个反馈:解释一下,我试图模拟一个我构建的工作方法,“addFront()”,它将值添加到链表的前面。我使用reverseList()的目标是(1)创建一个新列表(2),将新列表的开头设置为旧列表的开头(3)将旧列表中的下一个项目添加到新列表,同时替换将新项目与新项目相关联,然后将新项目链接到旧头部(作为其下一个属性)。 我会将我的addFront()方法添加到上面的代码中 - 是否更有意义我想要完成/我的逻辑? – natureminded

+0

@natureminded:我**认为**我理解(但不是肯定) - 我编辑了我的回答 – Gerrat

+0

我真的很感谢你的辛勤工作,帮助我在这里,我尝试过使用更新后的节点代码尝试解决方案,但是我的名单似乎仍然是以相同的顺序。我觉得它很接近,但我认为乔纳斯比我想要的要干净一点。我真的很感激你试图帮助我理解我的代码:) – natureminded

0

我们可以通过递归函数

def reverse (item, tail = None): 
    next = item.next 
    item.next = tail 
    if next is None: 
     return item 
    else: 
     return reverse(next, item) 

扭转名单仅供参考,请访问:http://www.geeksforgeeks.org/reverse-a-list-in-groups-of-given-size/

+0

我尝试了你的解决方案,并感谢你的反馈!当我运行上面的代码片段时,出现以下属性错误:'AttributeError:'SinglyLinkedList'对象没有'next''属性 - 任何想法?非常感谢! – natureminded