python:如何检查链表是否已排序

时间:2016-11-09 01:00:15

标签: python python-3.x

我正在尝试理解链接列表的概念。我搜索了有关我的问题的信息,但我没有找到任何可以帮助我的答案。 我想知道如何检查链表是否已排序? 显然,我们不能使用简单的两行函数作为常规列表。 例如,如果我想检查我的列表是否已排序(不使用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

2 个答案:

答案 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(您需要更多 形式的方法),然后应用您已知的解决方案。