📜  Python中 llist 模块的 sllist 类

📅  最后修改于: 2022-05-13 01:55:31.847000             🧑  作者: Mango

Python中 llist 模块的 sllist 类

llist 是 CPython 的扩展模块,提供了基本的链表结构。它们比出列甚至标准列表要快得多。

单链表

它是一个简单的单向数据结构,因此只能从头到最后一个节点遍历。单链表的每个节点都包含数据和它之前的节点的地址。简单来说,每个节点都指向它之后的节点。下图显示了单链表的一般结构:

在 llist 中,有一个 sllist 对象可以帮助成功实现单链表。

列表对象

class llist.sllist([iterable]):返回一个从提供的可迭代对象初始化的新链表。如果没有给出可迭代对象,则生成链表但为空。

import llist
from llist import sllist, sllistiterator
  
lst = llist.sllist(['first', 'second', 'third'])
print(lst)

输出:

sllist([first, second, third])

sllist 支持以下属性:

  • first :只读属性,打印列表的第一个属性,如果列表为空,则打印 None。
    print(lst.first)
    

    输出:

    sllistnode(first)
  • last :只读属性,返回列表的最后一个元素(尾),如果列表为空,则返回 None。
    print(lst.last)
    

    输出:

    sllistnode(third)
  • size : 返回列表大小的只读属性
    print(lst.size)
    

    输出:

    3

sslist 还支持以下方法:

  • append(x) :将 x 添加到列表的右侧并返回一个插入的 sllist 节点。如果 x 已经是一个 sllist 节点,则创建一个新节点并使用从 x 中提取的值进行初始化。
    lst.append('fourth')
    print(lst)
    

    输出:

    sllist([first, second, third, fourth])
  • appendleft(x) :将 x 添加到列表的左侧并返回一个插入的 sllist 节点。如果 x 已经是一个 sllist 节点,则创建一个新节点并使用从 x 中提取的值进行初始化。
    lst.appendleft('fourth')
    print(lst)
    

    输出:

    sllist([fourth, first, second, third])
  • appendright(x) :将 x 添加到列表的右侧并返回一个插入的 sllist 节点。如果 x 已经是一个 sllist 节点,则创建一个新节点并使用从 x 中提取的值进行初始化。
    lst.appendright('fourth')
    print(lst)
    

    输出:

    sllist([first, second, third, fourth])
  • clear()从列表中清除所有节点。
    lst.clear()
    print(lst)
    

    输出:

    sllist()
  • extend(iterable) :将可迭代的元素附加到列表的右侧
    lst.extend(['fourth', 'fifth'])
    print(lst)
    

    输出:

    sllist([first, second, third, fourth, fifth])
  • extendleft(iterable) :将可迭代的元素附加到列表的左侧。
    lst.extendleft(['fourth', 'fifth'])
    print(lst)
    

    输出:

    sllist([fifth, fourth, first, second, third])
  • extendright(iterable) :将可迭代的元素附加到列表的右侧
    lst.extend(['fourth', 'fifth'])
    print(lst)
    

    输出:

    sllist([first, second, third, fourth, fifth])
  • insertafter(x, node) :在指定节点之后插入x,参数x应该是一个sllist节点,x的值被提取出来,给要插入的节点。
    node = lst.nodeat(0)
    lst.insertafter('fourth', node)
    print(lst)
    

    输出:

    sllist([first, fourth, second, third])
  • insertbefore(x, node) :在指定节点之前插入x,参数x应该是一个sllist节点,x的值被提取出来给要插入的节点。
    node = lst.nodeat(1)
    lst.insertbefore('fourth', node)
    print(lst)
    

    输出:

    sllist([first, fourth, second, third])
  • nodeat() :返回指定索引处的节点。如果从右侧开始计数,则允许使用负索引。
    node = lst.nodeat(1)
    print(node)
    

    输出:

    sllistnode(second)
  • pop() :从列表的右侧删除一个元素。
    lst.pop()
    print(lst)
    

    输出:

    sllist([first, second])
  • popleft() :从列表的左侧删除一个元素。
    lst.popleft()
    print(lst)
    

    输出:

    sllist([second, third])
  • popright() :从列表的右侧删除一个元素。
    lst.pop()
    print(lst)
    

    输出:

    sllist([first, second])
  • remove(node) : 移除指定节点
    node = lst.nodeat(1)
    lst.remove(node)
    print(lst)
    

    输出:

    sllist([first, third])
  • rotate(n) :旋转列表 n 步。如果 n 为正,则向右旋转,如果为负,则向左旋转。
    lst.rotate(-1)
    print(lst)
    

    输出:

    sllist([second, third, first])

除了这些方法之外,sllist 还支持迭代、cmp(lst1, lst2)、丰富的运算符、常数时间 len(lst)、hash(lst) 和下标引用 lst[1234] 用于按索引访问元素。

我们进一步讨论更多与 sllist 相关的 llist 对象:

列表节点

在单链表中实现一个节点,如果提供了值,则可以选择对其进行初始化。

node = llist.sllistnode('zeroth')
print(node)

输出:

sllistnode(zeroth)

该对象还支持以下属性:

  • next : 列表中的下一个节点
  • value :提取存储在特定节点中的值
node = lst.nodeat(0)
print(node.next)
print(node.value)

输出:

sllistnode(second)
first

slistiterator 对象

返回一个新的单链表迭代器。这些对象不是由用户创建的,而是由 sllist.__iter__() 方法返回以保持迭代状态。通过 sllistiterator 接口迭代将直接产生存储在节点中的值。

import llist 
from llist import sllist
  
lst = llist.sllist(['first', 'second', 'third'])
  
for value in lst:
  print(value)

输出:

first
second
third