2. 求表长

从上面两个算法中看到,不带头结点的单链表空表情况要单独处理,而带上头结点之后则不用了。在以后的算法中不加说明则认为单链表是带头结点的。算法1.3和1.4的时间复杂度均为O(n)。

3. 查找操作

(1) 按序号查找 Get_Linklist(L,i)

算法思路:从链表的第一个元素结点起,判断当前结点是否是第i个,若是,则返回该结点的指针,否则继续后一个,表结束为止。没有第i个结点时返回空。

(2) 按值查找即定位 Locate_LinkList(L,x)
算法思路:从链表的第一个元素结点起,判断当前结点其值是否等于x,若是,返回该结点的指针,否则继续后一个,表结束为止。找不到时返回空。
按序号查找和按值查找的时间复杂度均为O(n)。

4.插入
(1) 后插结点:设p指向单链表中某结点,s指向待插入的值为x的新结点,将
*s插入到*p的后面,插入示意图如图1.2。
操作如下:

(2) 前插结点:设p指向链表中某结点,s指向待插入的值为x的新结点,将
*s插入到*p的前面,插入示意图如图1.3,与后插不同的是:首先要找到*p的前驱*q,然后再完成在*q之后插入*s,设单链表头指针为L,操作如下:

后插操作的时间复杂性为O(1),前插操作因为要找 *p 的前驱,时间性能为O(n);其实我们关心的更是数据元素之间的逻辑关系,所以仍然可以将 *s 插入到 *p 的后面,然后将p->data与s->data交换即可,这样即满足了逻辑关系,也能使得时间复杂性为O(1)。

(3) 插入运算 Insert_LinkList(L,i,x)
算法思路:1.找到第i-1个结点;若存在继续2,否则结束

2.申请、填装新结点;
3.将新结点插入。结束。
5. 删除