Singly Linked List Search And Build
单链表的查找与建立
按位查找
带头结点单链表中,GetElem(L, i) 获取第 i 个数据结点。
基本思路:从头结点开始,沿 next 指针向后移动,直到第 i 个数据结点。
边界:
i < 1非法。- 遍历到
NULL仍未到第i个位置,说明位序越界。
时间复杂度:O(n)。
1 | LNode *GetElem(LinkList head, int index) { |
返回 NULL 表示位序非法或越界。注意这里 position = 1 时,current 指向第一个数据结点,而不是头结点。
按值查找
从第一个数据结点开始,依次比较 data 与目标值 e。找到则返回该结点指针或位序,找不到返回 NULL 或失败标记。
时间复杂度:O(n)。
1 | LNode *LocateElem(LinkList head, ElemType value) { |
求表长
从第一个数据结点开始遍历,计数直到 NULL。
时间复杂度:O(n)。
1 | int Length(LinkList head) { |
尾插法建立单链表
尾插法按输入顺序建立链表,适合保持原序。
基本步骤:
- 初始化带头结点链表。
- 设置尾指针
tail指向当前表尾,初始为头结点。 - 每读入一个元素,申请新结点
newNode。 - 令
tail->next = newNode,再令tail = newNode。 - 输入结束后令
tail->next = NULL。
特点:建立结果与输入顺序一致。
1 | LinkList List_TailInsert(void) { |
尾指针 tail 始终指向当前最后一个结点,避免每插入一个新结点都从头找表尾。
头插法建立单链表
头插法每次把新结点插入头结点之后。
基本步骤:
- 初始化带头结点链表。
- 每读入一个元素,申请新结点
newNode。 - 令
newNode->next = head->next。 - 令
head->next = newNode。
特点:建立结果与输入顺序相反;常用于链表逆置类问题。
1 | LinkList List_HeadInsert(void) { |
头插法每次都插在头结点之后,所以后读入的元素会排在更前面。
关联
建立链表本质上反复使用后插操作。插入和删除细节见 单链表的插入与删除。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Elian's blog page!