一、链表的简单理解
1.链表的概念及结构
链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链
接次序实现的 。
注意:
1.从上图可看出,链式结构在逻辑上是连续的,个但是在物理上不一定连续
2.现实中的结点一般都是从堆上申请出来的
3.从堆上申请的空间,是按照一定的策略来分配的,两次申请的空间可能连续,也可能不连续
假设在32位系统上,结点中值域为int类型,则一个节点的大小为8个字节,则也可能有下述链表:
2.理解链表的基本概念:
链表是一种动态数据结构,通过指针将一系列节点连接在一起。
每个节点包含两部分:数据域和指针域。数据域用于存储数据,指针域用于指向下一个节点。
链表的入口节点称为头结点,其指针域指向第一个数据节点。
链表分为单链表、双链表和循环链表等类型。
3.掌握链表的基本操作:
初始化链表:创建一个头结点,并将其指针域设置为NULL。
插入节点:在链表的指定位置插入一个新节点。这通常涉及修改前后节点的指针域。
删除节点:从链表中删除指定位置的节点。这同样需要修改前后节点的指针域。
查找节点:根据给定条件查找链表中的节点。
遍历链表:从头结点开始,依次访问链表中的每个节点。
二、链表的题目
第一题:移除链表元素
https://leetcode.cn/problems/remove-linked-list-elements/
这个题目可以创建一个新的链表即newhead和newtail,并且同时置为空。
当L1走到逐渐往下走去的时候,进行判断L1->val值不等于val的时候进行循环,如果新链表为空,那么就直接将 L1的值带入进去
要是不为空,就进行尾插,即:newtail->next=val,并让newtail往下走将其赋值给newtail即newtail=newtail->next;总体L1也要随着循环往下走。
最后当newtail不为空的时候,要让newtail的下一个节点指向空。
代码的总体展示1
typedef struct ListNode listnode ;
struct ListNode* removeElements(struct ListNode* head, int val)
{
listnode *l1=head;
listnode *newhead=NULL;
listnode *newtail=NULL;
while(l1)
{
if(l1->val!=val)
{
if(newhead==NULL)
{
newhead=newtail=l1;
}else
{
newtail->next=l1;
newtail=newtail->next;
}
}
l1=l1->next;
}
if(newtail)
{
newtail->next=NULL;
}
return newhead;
}
typedef 是一个关键字,用于为已有的数据类型定义一个新的名称(别名)。使用 typedef 可以使代码更加清晰和易于阅读,尤其是当涉及到复杂的数据类型或结构体时。
第二题:反转链表
https://leetcode.cn/problems/reverse-linked-list/description/
代码的整体展示2
typedef struct ListNode listnode;
struct ListNode* reverseList(struct ListNode* head)
{
listnode *cur=head;
listnode *newhead=NULL;
while(cur)
{
listnode *next=cur->next;
cur->next=newhead;
newhead=cur;
cur=next;
}
return newhead;
}
总结
链表的题目主要是学会画图,结合题目实际情况去攻克难关!
学习C语言实现链表:
定义链表节点结构体:包含数据域和指针域。
编写链表操作函数:如初始化链表、插入节点、删除节点、查找节点和遍历链表等。
在主函数中调用这些函数,以演示链表的使用。
实践练习:
编写简单的链表程序,如实现一个整数链表,并对其进行插入、删除、查找和遍历等操作。
尝试解决与链表相关的算法问题,如链表反转、合并两个有序链表等。