基础数据结构和算法:链表

  • 顺序表的缺点
    1.添加和删除操作需要移动元素
    2.当数据量特别大的情况,可能没有连续的累出你可使用

  • 链表:通过指针方式建立元素之间前后链接关系

  • 定义操作
    1.创建链表

bool linklist_init(LinkList* plist);

2.添加元素

bool linklist_append(LinkList* plist,LinkType value);
bool linklist_prepend(LinkList* plist,LinkType value);

3.获取元素

LinkType linklist_get(LinkList* plist,int index);

4.获取元素个数

int linklist_size(LinkList *plist);

5.插入元素

bool linklist_insert(LinkList* plist,int index,LinkType value);

6.删除元素

bool linklist_remove(LinkList *plist,int index);

7.销毁链表

bool linklist_destory(LinkList* plist);
  • 优化
    1.创建
    将结构体定义和初始化合二为一
LinkType linklist_create();

2.随机访问元素

LinkType* linklist_at(LinkList* plist,int index);

3.遍历

typedef void (*LinkList_Traversal)(const LinkType* value);
void linklist_traverse(LinkList* plist,LinkList_Traversal fp);

4.获取链表大小

每次获取链表元素个数都要整个遍历一遍,时间复杂度为O(n)。在LinkList中添加成员int size;记录链表元素个数,时间复杂度降为O(1)。注意初始化、添加和删除元素函数都需要添加相应处理。

5.尾部添加数据

每次尾添加数据都要整个遍历一遍,时间复杂度为O(n)。在LinkList中添加成员Node* tail;记录链表最后一个节点,时间复杂度降为O(1)。注意初始化、添加和删除元素函数都需要添加相应处理。

6.头节点

链表添加第一个节点和最后一个节点需要额外处理,添加一个额外的头节点可以简化处理。头指针出现改变的情况,链表添加第一个节点和最后一个节点与添加删除中间节点处理一致。

  • 插入和删除操作分析

1.插入

  • 头插入
    在这里插入图片描述
  • 尾插入
    在这里插入图片描述2.删除
    • 开头删除
      在这里插入图片描述
    • 尾部删除
      在这里插入图片描述
    • 中间删除

在这里插入图片描述

  • 注意

1.空链表删除节点(此情况使用断言或者抛出异常)
2.待删除节点的链表中只有一个节点(删除后把头指针和尾部指针设置为空)

其余链表简介:
https://www.jianshu.com/p/2cc8c521d73c

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值