[一篇读懂]C语言十一讲:单链表的删除和单链表真题实战
1. 与408关联解析及本节内容介绍
1 本节内容介绍
本节分为四小节讲解。
第一小节是链表删除进行实战
第二小节是是针对408考研真题2019年41题进行题目解读与解题设计
第三小节是针对408考研真题2019年41题进行实战
第四小节是分析真题实战代码的时间复杂度
2. 单链表的删除操作实战
- 一切数据结构 - 增删查改
之前介绍了链表的新增、删除、查找的原理。
- 单链表删除操作流程图:

画流程图很关键。
单链表删除操作:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType; //写分号
typedef struct LNode
{
ElemType data; //数据域
struct LNode* next;
}LNode, * LinkList;
void list_tail_insert(LNode*& L)
{
L = (LinkList)malloc(sizeof(LNode));//申请头结点空间,头指针指向头结点
L->next = NULL;//头结点的next为NULL
ElemType x;
scanf("%d", &x);
LNode* s, * r = L;//s用来指向申请的新节点,r始终指向列表尾部
while (x != 9999)
{
s = (LinkList)malloc(sizeof(LNode));//为新节点申请空间
s->data = x;
r->next = s;//新节点给尾节点的next指针
r = s;//r要指向新的尾部
scanf("%d", &x);
}
r->next = NULL;//让尾节点的next为NULL
}
void print_list(LinkList L)
{
L = L->next;
while (L != NULL)
{
printf("%3d", L->data);
L = L->next;
}
printf("\n");
}
//按位置查找
LinkList GetElem(LinkList L, int SearchPos)
{
int j = 0;
if (SearchPos < 0)
{
return NULL;
}
while (L && j < SearchPos)//L!=NULL,地址不为NULL
{
L = L->next;
j++;
}
return L;
}
//删除第i个位置的元素
//删除时不改变L,所以不需要加引用
bool ListDelete(LinkList L, int i)
{
LinkList p = GetElem(L, i - 1);//拿到要删除结点的前一个结点指针p
//判断p是不是空的
if (NULL == p)
{
return false;
}
LinkList q = p->next;//拿到p的下一个结点指针 - 即要删除的结点指针
p->next = q->next;//断链
free(q);//释放
return true;
}
//尾插法新建链表
int main()
{
LinkList L; //L是链表头指针,是结构体指针类型 - 大小8个字节
//list_head_insert(L); //输入数据可以为3 4 5 6 7 9999,头插法新建链表
list_tail_insert(L);
print_list(L); //链表打印
ListDelete(L, 4)

本文详细介绍了C语言中单链表的删除操作,包括流程图解释和代码实现,并通过2019年408考研真题解析了如何在O(1)空间复杂度下高效地重新排列链表。文章涵盖了双指针找中间结点、原地逆置链表以及轮流合并链表的解题设计和代码实现,最后分析了各部分的时间复杂度。

1万+

被折叠的 条评论
为什么被折叠?



