基础数据结构学习记录:链表

链表(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):



参考《算法导论》

你可能感兴趣的:(基础数据结构学习记录:链表)