我正在尝试理解链接列表的概念。我搜索了有关我的问题的信息,但我没有找到任何可以帮助我的答案。
我想知道如何检查链表是否已排序?
显然,我们不能使用简单的两行函数作为常规列表。
例如,如果我想检查我的列表是否已排序(不使用list.sort()
),我将创建如下函数:
def is_sorted(l):
return all(a <= b for a, b in zip(l[:-1], l[1:]))
但是对于链表,我应该比较列表尾部和头部值吗?它是如何工作的?
我用来创建链接列表的构造:
class Node :
def __init__(self, data):
self.data = data
self.next = None
self.prev = None
class LinkedList:
def __init__(self):
self.head = None
def add(self, data):
node = Node(data)
if self.head == None:
self.head = node
else:
node.next = self.head
node.next.prev = node
self.head = node
def search(self, k):
p = self.head
if p != None :
while p.next != None :
if ( p.data == k ) :
return p
p = p.next
if ( p.data == k ) :
return p
return None
def remove( self, p ) :
tmp = p.prev
p.prev.next = p.next
p.prev = tmp
def __str__( self ) :
s = ""
p = self.head
if p != None :
while p.next != None :
s += p.data
p = p.next
s += p.data
return s
答案 0 :(得分:3)
你可以做同样的事情。唯一需要注意的是,您需要一种迭代链表的方法......
class LinkedList:
...
def __iter__(self):
p = self.head
while p:
# I yield the data for simplicity in this problem.
# Depending on the constraints for linked lists, it might be
# nicer to yield nodes.
yield p.data
p = p.next
现在我们已经知道了,检查它是否已经排序很容易,而且非常类似于您之前为列表编写的方法:
def is_sorted(linked_list):
iter1 = iter(linked_list)
iter2 = iter(linked_list)
next(iter2, None) # drop the first element in iter2.
return all(i1 <= i2 for i1, i2 in zip(iter1, iter2))
另请注意,使用迭代链表的方法确实简化了您已编写的其他方法。 e.g。
def __str__(self):
return ''.join(iter(self)) # Original code assumes string data, so I do too.
答案 1 :(得分:0)
将其称为 linkedList 并不会使其与Python的列表类型兼容。 : - )
您的 LinkedList 类没有必要的方法使它成为Python中的可迭代对象。因此,您不能使用可用于迭代的内置函数。你必须编写一个新的方法来检查列表:从头到尾遍历,检查每个元素的值是&gt; =前一个。
或者,查找使其成为可迭代所需的additional methods(您需要更多 形式的方法),然后应用您已知的解决方案。