什么是链表
下面是我对链表概念的一些总结。
链接: link.
链表实现尾删
我们都知道链表都是每个节点依靠一个指针来指向下一个节点的。
因为链表不支持随机访问 所以要实现尾删我们就需要找到该链表最后一个节点的前一个节点,然后将这个节点的next指针指向由最后一个节点改变为null。
我们可以使用一个指向为空的指针 prev和一个指向头节点的指针tail
因为如果一个链表的节点不是尾节点的话,那么这个节点的next指针指向的肯定不是NULL,
那如何找该链表最后一个节点的前一个节点呢?
当tail指向的不是NULL时我们让prev 指向tail指向的节点,而tail指向tail的下一个节点,循环直到tail指向null时,prev指向的就是我们要删除的最后一个节点的前一个节点,这样我们就找到了。
你以为这样就完了吗 ?😏
答案是 当然没有完,因为我们还有很重要的一步没有做那就是释放我们要删除的那个结点的空间。如果不是放会产生很严重的后果,会造成内存泄露。
如下图
实现如下
//尾删
void popback(list* lst) {
if (lst == NULL || lst->_head == NULL)
return;
//遍历 找到最后一个节点
listnode* prev = NULL;
listnode* tail = lst->_head;
while (tail->_next != NULL) {
prev = tail;
tail = tail->_next;
}
//释放最后一个节点
free(tail);
//更新next
if(prev==NULL)//只有一个节点更新head节点
//if (lst->_head->_next == NULL)
{
lst->_head = NULL;
}
else
prev->_next = NULL;
}
欢迎大家和我一起交流学习知识哦😄