有人能帮我找出这个代码出了什么问题吗?代码正在打印链接列表中的第一个节点,而不是已排序的链接列表。在
class LinkedList(object):
def __init__(self):
self.head = None
class Node(object):
def __init__(self,data):
self.data = data
self.next = None
def push(self, new_data):
new_node = self.Node(new_data)
new_node.next = self.head
self.head = new_node
def print_list(self):
temp = self.head
while(temp):
print temp.data
temp = temp.next
def front_back_split(head):
if(head is None or head.next is None):
head1 = head
head2 = None
else:
slow = head
fast = head.next
while(fast != None):
fast = fast.next
if(fast!=None):
slow = slow.next
fast = fast.next
head1 = head
head2 = slow.next
slow.next = None
return head1, head2
def merge_sort(head):
if(head is None or head.next is None):
return
a,b = front_back_split(head)
merge_sort(a)
merge_sort(b)
new_head = merge_lists(a,b)
return new_head
if __name__=='__main__':
llist1 = LinkedList()
llist1.push(6)
llist1.push(7)
llist1.push(1)
llist1.push(4)
llist1.push(3)
llist1.push(8)
print "Sorted list"
new_head = merge_sort(llist1.head)
llist1.print_list()
此响应适用于代码的早期版本。请参阅我的新响应,以获取新版本代码的修复。在
好的,问题是你从函数返回链表的方式。在},但这些只是函数的参数。一、 它们是局部变量。分配给它们对调用者没有影响。在
front_to_back_split
中,将赋值给head1
和{更好的方法是消除}作为参数,而只将它们作为普通的局部变量。{{cd2>然后改成
head1
和{然后,在}。相反,您只需:
^{pr2}$merge_sort
中,您不再需要分配a
和{类似地,
merge_sort
应该返回新的head
,这样调用者就可以使用它了。否则,调用者无法确定新的列表头是什么。在好的,我已经调试了你的更新版本,现在可以用了。有三个变化:
在
merge_sort
的顶部有一个空的return
。更改为:在},如下所示:
merge_sort
中,更改递归调用,使它们更新a
和{在主代码中,对列表排序后,需要一个带有新头的
LinkedList
才能打印它,因为llist1
仍然指向旧的头。您可以使用这个:相关问题 更多 >
编程相关推荐