[一篇读懂]C语言十一讲:单链表的删除和单链表真题实战

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


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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

0000n

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值