链表(linked list)这种数据结构的各对象按线性顺序排列,其顺序是由各对象中的指针决定的(数组的线性顺序是由数组下标决定的)。链表为动态集合提供了一种简单而灵活的表示方法(前面的栈和队列都是通过数组实现的)。
链表可以有多种形式。可以是单链接的或双链接的,可以是已排序的或未排序的,可以是循环的或非循环的。此处以未排序的双向链表(doubly linked list)L 为例。L 的每一个元素都是一个对象,每个对象有一个关键字 key 和两个指针:next 和 prev(对象中还可以包括其他数据或称为卫星数据)。
设 x 为列表的一个元素,x.next指向它在链表中的后继元素,x.prev 指向它的前驱元素。链表的头(head)对应 的情况为x.prev=NIL;链表的尾(tail)对应情况为 x.next = NIL。
链表的基本操作有:搜索、插入和删除。
搜索
LIST-SEARCH(L,k)
x = L.head
while x != NIL and x.key != k # 链表非空 与 键值不等于 k
x = x.next
return x
过程 LIST-SEARCH(L,k) 采用简单的线性搜索方法,查找链表 L 中第一个关键字为 k 的元素,并返回指向该元素的指针。如果 L 没有符合条件的对象,则过程返回 NIL。
插入
LIST-INSERT(L,x)
x.next = L.head
if L.head != NIL
L.head.prev = x
L.head = x
x.prev = NIL
给定一个已设置好关键字 key 的元素 x,将 x 插入到链表的表头。
删除
LIST-DELETE(L,x)
if x.prev != NIL
x.prev.next = x.next
else
L.head = x.next
if x.next != NIL
x.next.prev = x.prev
程序实现(C):
参考《算法导论》
网友评论