数据结构【单链表实现、Leetcode链表面试题--3】

目录

1.1 单链表的概念

1.2 单链表的结构 

1.3 本期链表的结构实现:无头单向非循环链表

2. 单链表的实现

2.1 单链表定义

2.2 动态申请内存

2.3 单链表尾插

2.4 单链表的尾删

2.5 打印单链表

2.6 单链表头插

2.7 单链表头删

2.8 单链表查找

2.9 单链表修改

2.10 单链表在pos位置之前插入x

2.11 单链表删除pos位置的值

2.12 单链表在pos位置之后插入x

2.13 单链表删除pos位置之后的值

3.LeetCode刷题

4.1 LeetCode 反转链表

4.2 Leetcode链表的中间结点

4.3  链表中倒数第k个结点

4.4 Leetcode合并两个有序链表

4.5 Leetcode移除链表元素


1.1 单链表的概念

链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的,单链表是一种链式存取的数据结构,链表中的数据是以结点来表示的,每个结点由元素和指针构成。

链表通过不连续的储存方式,自适应内存大小,以及指针的灵活使用,巧妙的简化了上述的内容。

链表的基本思维是,利用结构体的设置,额外开辟出一份内存空间去作指针,它总是指向下一个结点,一个个结点通过NEXT指针相互串联,就形成了链表。


1.2 单链表的结构 

以结点的序列表示的线性表称作线性链表,也就是单链表,单链表是链式存取的结构。对于链表的每一个结点,我们使用结构体进行设计,其主要内容有

 其中,DATA数据元素,可以为你想要储存的任何数据格式,NEXT为一个指针,其代表了一个可以指向的区域,通常是用来指向下一个结点,链表的尾部NEXT指向NULL(空),因为尾部没有任何可以指向的空间了


1.3 本期链表的结构实现:无头单向非循环链表

1. 无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多。


2. 单链表的实现

SList.c 单链表函数实现
SList.h 创建单链表,单链表申明
Test.c 测试单链表

2.1 单链表定义

typedef int SLTDateType;//便于修改数据类型

typedef struct SList
{
	SLTDateType Node;//数据
	struct SList* next;//结点
}SList;

2.2 动态申请内存

 注意事项:

1.动态开辟内存有可能开辟失败

SList* BuySListNode(SLTDateType x)//动态申请一个节点
{
	SList* NewNode = (SList*)malloc(sizeof(SList));//动态开辟内存空间
	assert(NewNode);//有可能开辟失败
	NewNode->Node = x;
	NewNode->next = NULL;//指针初始化
	return NewNode;
}

2.3 单链表尾插

 注意事项:

1.需考虑两种情况:此时单链表上存在结点、此时单链表上不存在结点

2.如果此时需要修改plist,我们传一级指针是否可行?

 一级指针传参用一级指针接收,传过来的是形参,接收的只是一级指针的值,我们修改一级指针无法改变plist,所以我们需要传递二级指针pplist来改变一级指针plist

 3.遍历找到最后一个结点,使用尾结点连接新开辟的空间

void SListPushBack(SList** pplist, SLTDateType x)//尾插单链表
{
    assert(pplist);
	SList* NewNode = BuySListNode(x);//开辟新空间
	//考虑此时头结点没有数据
	if (*pplist == NULL)
	{
		*pplist = NewNode;
	}
	else
	{
		//考虑已经有结点,尾插数据
		SList* tail = *pplist;
		while(tail->next != NULL)
		{
			tail = tail->next;//找到尾
		}
		tail->next = NewNode;//尾插
	}
}	


2.4 单链表的尾删

 注意事项:

1.要改变plist,就得传二级指针

2.此时有一个以上结点

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

北方留意尘

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

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

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

打赏作者

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

抵扣说明:

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

余额充值