我在为有序链接列表创建插入函数时遇到问题。以下是我到目前为止的情况:
class Node:
def __init__(self, initial_data):
self.data = initial_data
self.next = None
def get_data(self):
return self.data
def get_next(self):
return self.next
def set_data(self, new_data):
self.data = new_data
def set_next(self, new_next):
self.next = new_next
class LinkedList:
def __init__(self):
self.head = None
def __str__(self):
output_string = ''
current = self.head
while current is not None:
output_string += str(current.get_data())
next_node = current.get_next()
if next_node is not None:
output_string += "->"
current = next_node
return output_string
def insert(self, data):
other = self.head
previous = None
if other is None:
new_node = Node(data)
new_node.set_next(self.head)
self.head = new_node
else:
while data > other.get_data():
previous = other
other = other.get_next
previous.set_next(Node(data))
答案 0 :(得分:0)
我认为改变这个:
else:
while data > other.get_data():
previous = other
other = other.get_next
previous.set_next(Node(data))
对此,应该让它发挥作用。
else:
# First condition will short circuit so there won't be exception on calling other.get_data() if other is None
while other is not None and data > other.get_data():
previous = other
other = other.get_next()
node = Node(data)
node.set_next = previous.get_next()
previous.set_next(node)
此外,python中并不一定需要getter和setter方法。
如果您需要这种行为,则惯例是使用@property
注释,私有成员通常以_
为前缀。
答案 1 :(得分:0)
您需要将项目插入列表中。这意味着您需要:
您在技术上不需要打破链条,因为设置previous
项目上的下一个链接将清除旧链接,因此您需要做的就是再次加入链接:
while data > other.get_data():
previous = other
other = other.get_next()
new = Node(data)
previous.set_next(new)
new.set_next(other)
我还更正了其他错误,您没有致电 Node.get_next()
。
接下来,您需要更多地考虑边缘情况。当您到达链的 end 但未找到{em>任何节点node.get_data()
大于插入的数据时会发生什么?
您需要调整while
循环以确保测试该情况;对于链的最后一个元素,other
将为None
:
while other is not None and data > other.get_data():
previous = other
other = other.get_next()
new = Node(data)
previous.set_next(new)
new.set_next(other)
您还可以采取其他措施来改进代码。在Python中不需要使用setter和getter;将属性转换为@property
以后不需要花费任何费用,所以只需在此使用属性。
您还可以让Node()
接受构造函数中的下一个元素,这样可以更轻松地插入元素。
您可以使用str.join()
在序列的元素之间插入固定字符串。将所有data
属性放入Python list
并加入该列表。
创建初始元素时(self.head
为self.head
时),您无需将None
设置为下一个节点;无论如何,这是默认值:
class Node:
def __init__(self, initial_data, next=None):
self.data = initial_data
self.next = next
class LinkedList:
def __init__(self):
self.head = None
def __str__(self):
data_list = []
current = self.head
while current is not None:
data_list.append(str(current.data))
current = current.next
return '->'.join(data_list)
def insert(self, data):
other = self.head
previous = None
if other is None:
self.head = Node(data)
else:
while other is not None and data > other.data:
previous = other
other = other.next
previous.next = Node(data, other)
演示:
>>> ll = LinkedList()
>>> str(ll)
''
>>> ll.insert(10)
>>> str(ll)
'10'
>>> ll.insert(20)
>>> str(ll)
'10->20'
>>> ll.insert(15)
>>> str(ll)
'10->15->20'