有序链表:17,26,31,54,77,93
。由于 17
是最小项,它占据第一位置。同样,由于 93
是最大的,它占据最后的位置。
排序通常是升序或降序。
有序链表的抽象数据类型
下面给出了一些可能的无序链表操作:
操作 | 描述 | 返回值 |
---|---|---|
OrderedList | 创建一个新的空链表,不需要参数 | 返回一个空链表 |
add(item) | 向链表中添加一个新项,需要 item 作为参数 | 不返回任何内容 |
remove(item) | 从链表中删除该项,需要 item 作为参数并修改链表 | |
search(item) | 搜索链表中的项目,需要 item 作为参数 | 返回一个布尔值 |
isEmpty() | 检查链表是否为空,不需要参数 | 返回布尔值 |
size() | 返回链表中的项数,不需要参数 | 返回一个整数 |
append(item) | 将一个新项添加到链表的末尾,使其成为集合中的最后一项,需要 item 作为参数 | 不返回任何内容 |
index(item) | 返回项在链表中的位置,需要 item 作为参数 | 返回索引 |
pop() | 删除链表中的最后一个项 | 返回删除项 |
pop(pos) | 删除位置 pos 处的项,需要 pos 作为参数 | 返回删除项 |
python实现有序链表
创建有序链表
class OrderedList:
def __init__(self):
self.head = None
isEmpty
、和size
、remove
方法同无序链表的实现方式一致,search
、add
。
有序链表搜索
搜索无序链表时需要我们一次遍历一个节点,直到找到我们正在寻找的节点或者没找到节点(None)。事实证明,相同的方法在有序链表中也有效。然而,在项不在链表中的情况下,我们可以利用该顺序来尽快停止搜索。
下图展示了搜索45
的过程:从链表的头部开始遍历,首先与 17 进行比较。由于 17 不是我们正在寻找的项,移动到下一个节点 26 。再次,这不是我们想要的,继续到 31,然后再到 54 。在这一点上,有一些不同。由于 54 不是我们正在寻找的项,我们以前的方法是继续向前迭代。然而,由于这是有序列表,一旦节点中的值变得大于我们正在搜索的项,搜索就可以停止并返回 False 。该项不可能存在于后面的链表中。
def search(self,item):
current = self.head
found = False
stop = False
while current != None and not found and not stop:
if current.getData() == item
found = True
else:
if current.getData > item:
stop = True
else:
current = current.getNext()
return found
有序链表中添加项
对于无序列表,add
方法可以简单地将新节点放置在链表的头部。 这是最简单的访问点。 不幸的是,这将不再适用于有序列表。需要在现有的有序列表中查找新项所属的特定位置。
如图,假设我们有由
17,26,54,77,93
组成的有序列表,并且我们要添加值31
。 add
方法必须确定新项属于 26
与 54
之间。
def add(self,item):
current = self.head
previous = None
stop = False
while current != None and not stop:
if current.getData() > item:
stop = True
else:
previous = current
current = current.getNext()
temp = Node(item)
if previous == None:
temp.setNext(self.head)
self.head = temp
else:
temp.setNext(current)
previous.setNext(temp)
网友评论