2011-12-18 41 views
1

我想在python中创建一个简单的单链表。 (我知道有没有必要实施在Python列表,但是这不是重点)Python中的单向链表反转

这里是我的代码:

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



class List: 
    def __init__(self): 
     self.firstNode = Node(None) 

    def inserthead(self,newnode): 
     if not self.firstNode.next: 
      newnode.next = None 
      self.firstNode.next = newnode 
     else: 
      newnode.next = self.firstNode.next 
      self.firstNode.next= newnode 


    def __show(self,start): 
     if start.next: 
      print start.data 
      self.__show(start.next) 

    def printlist(self): 
     self.__show(self.firstNode) 

    def __reverte_recursive(self,node): 
     temp = None 
     if not node.next: return node 
     else: 
      temp = self.__reverte_recursive(node.next) 
      node.next.next= node 
      node.next = None 
     return temp 

    def reverte_list1(self): 
     self.firstNode=self.__reverte_recursive(self.firstNode) 

    def __reverte_iterative(self,node): 
     temp = None 
     previous = None 
     while node and node.next: 
      temp = node.next 
      node.next= previous 
      previous = node 
      node = temp 
     return previous 
    def reverte_iterative(self): 
     self.firstNode=self.__reverte_iterative(self.firstNode) 

nodeA = Node("A") 
nodeB = Node("B") 
nodeC = Node("C") 
nodeD = Node("D") 
nodeE = Node("E") 


list1= List() 

list1.inserthead(nodeA) 
list1.inserthead(nodeB) 
          class Node: 
    def __init__(self,data): 
     self.data = data 
     self.next= None 



class List: 
    def __init__(self): 
     self.firstNode = Node(None) 

    def inserthead(self,newnode): 
     if not self.firstNode.next: 
      newnode.next = None 
      self.firstNode.next = newnode 
     else: 
      newnode.next = self.firstNode.next 
      self.firstNode.next= newnode 


    def __show(self,start): 
     if start.next: 
      print start.data 
      self.__show(start.next) 

    def printlist(self): 
     self.__show(self.firstNode) 

    def __reverte_recursive(self,node): 
     temp = None 
     if not node.next: return node 
     else: 
      temp = self.__reverte_recursive(node.next) 
      node.next.next= node 
      node.next = None 
     return temp 

    def reverte_list1(self): 
     self.firstNode=self.__reverte_recursive(self.firstNode) 

    def __reverte_iterative(self,node): 
     temp = None 
     previous = None 
     while node and node.next: 
      temp = node.next 
      node.next= previous 
      previous = node 
      node = temp 
     return previous 
    def reverte_iterative(self): 
     self.firstNode=self.__reverte_iterative(self.firstNode) 

nodeA = Node("A") 
nodeB = Node("B") 
nodeC = Node("C") 
nodeD = Node("D") 
nodeE = Node("E") 


list1= List() 

list1.inserthead(nodeA) 
list1.inserthead(nodeB) 
list1.inserthead(nodeC) 
list1.inserthead(nodeD) 
list1.inserthead(nodeE) 


print "list" 
list1.printlist() 
print "list reverse" 
list1.reverte_list1() 
list1.printlist() 
list1.reverte_iterative() 
print "list reverse reverse" 
list1.printlist() 

,并有结果:

None 
E 
D 
C 
B 
list reverse 
A 
B 
C 
D 
E 
list reverse reverse 
E 
D 
C 
B 

为某些原因我不能打印所有列表,并在第一种情况下不打印“A”节点 但打印第一个节点(但我检查和B节点指向A) 第一个反向是好的 但这个rd再次不打印A节点,即使它是由B节点指向的。 打印的问题可能在__show函数中。 但我想我是一个概念性的错误。

感谢

+0

出来的好奇心,为什么? –

+0

C是easyer更适合这种事情,但我正在接受面试的培训,我想看看这是如何在python – kurojishi

回答

3
def __show(self,start): 
    if start.next: 
     print start.data 
     self.__show(start.next) 

,仅显示当前节点,如果有下一个节点,这就是为什么从不打印的最后一个节点。 应该是:

def __show(self,start): 
    if start: 
     print start.data 
     self.__show(start.next) 

你做检查的类似的错误/分配节点,而不是它的旁边,反之亦然整个代码(inserthead()例如 - 这是造成正在打印的None

+0

这是可能的谢谢,就是这样 – kurojishi