学海无涯~~
看该文章需要有那么一点点的理论知识,写的不好,本文如有问题请各位大佬指出。
代码传送门(代码写得不完善,有兴趣的朋友可以看看) gitee.com/huang-yuanc…
该代码编辑编译环境为 apple m1 机器 在其他环境下没试过,有兴趣的朋友可以尝试一下
简介
该文章简单的介绍什么是单向链表,如何实现一个单向链表,如何实现翻转,如何实现查找等。
什么是单向链表
顾名思义,单向链表,每一张表,依次的拼接起来,好比单向行车道,逆行是不可以的。
如何实现单向链表
个人习惯用结构体(不了解的可以google 一下),方便。
例如定义一个结构体。
struct list_node
{
int count;
list_node *next;
};
添加一个节点。方式很多,这里采用永远记录最后一个节点,直接添加(不采用循环遍历方式)。
好处:效率高。坏处:不能在添加的时候做排序。
循环遍历方式,好处:可以在添加时做好排序。坏处:效率极低。
list_node *temp_node_ = nullptr;
temp_node_ = static_cast<list_node *>(malloc(sizeof(list_node)));
if(temp_node_ == nullptr)
{
return false;
}
else
{
temp_node_->count = count_paramter;
temp_node_->next = nullptr;
}
if(_head_node == nullptr)//判断头节点是否为空
{
_head_node = _end_node = temp_node_;//赋值头节点,尾节点
}
else
{
if(_end_node != nullptr)
{
_end_node->next = temp_node_;
_end_node = temp_node_;
}
else
{
return false;
}
}
单向链表翻转
链表翻转,例如:链表为 1,2,3,4 翻转后为4,3,2,1
翻转的步骤为:
1-- 1,2,3,4
2-- 2,3,4,1
3-- 3,4,2,1
4-- 4,3,2,1
上代码~
list_node *temp_head_node_ = _head_node;
list_node *temp_node_ = nullptr;
while(temp_head_node_ != nullptr)
{
temp_node_ = temp_head_node_;
temp_head_node_ = temp_head_node_->next;
if(_temp_node == nullptr)
{
temp_node_->next = nullptr;
_temp_node = temp_node_;
}
else
{
temp_node_->next = _temp_node;
_temp_node = temp_node_;
}
}
_head_node = _temp_node;
_temp_node = nullptr;
return true;
单向链表查找
单向链表基本循环查找 如下代码,但这种查找在数量极小时(几个),不考虑效率,但如链表非常大的时候,效率如同循环添加一般很慢。所以 在添加完后可以把链表切片做成b+tree,查找效率提升。
list_node *temp_node_ = _head_node;
while (temp_node_ != nullptr)
{
if(temp_node_->count == count_paramter)
{
return temp_node_;
}
temp_node_ = temp_node_->next;
}