各类资料学习下载合集
https://pan.quark.cn/s/8c91ccb5a474
今天我们来聊一聊数据结构中一个非常基础且重要的话题——链表。链表不仅是面试中的常客,更是理解指针和内存管理精髓的绝佳练习。本文将根据课堂笔记,带你一步步攻克两个核心操作:链表反转和统计链表节点个数。
我们将通过详细的思路分析、图解和完整的C语言代码,让你彻底掌握这两个关键技能。
一、 准备工作:定义链表结构
在开始之前,我们首先需要定义链表节点的数据结构。一个链表节点通常包含两部分:
- 数据域(data):用于存储节点的值。
- 指针域(next):用于指向下一个节点,通过它将所有节点串联起来。
在C语言中,我们可以用一个结构体来表示:
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
struct link_node {
int data; // 数据域
struct link_node* next; // 指针域,指向下一个节点
};
二、 核心技能一:链表反转
链表反转是面试中的高频题。它的目标是将一个给定的链表,例如 10 -> 20 -> 30 -> 40
,原地反转为 40 -> 30 -> 20 -> 10
。
1. 算法思路
直接反转听起来可能有些抽象,但关键在于改变每个节点的指针(next
)指向。想象一下,原来节点1指向节点2,现在我们要让节点2指向节点1。
为了实现这个操作,我们需要借助三个辅助指针:
-
pre
:指向当前节点的前一个节点。 -
current
:指向当前正在处理的节点。 -
next
:临时保存当前节点的下一个节点,防止链表断裂。
反转过程就像解开一串珠子,然后按相反的顺序重新串起来。
图解反转步骤(以 10 -> 20 -> 30
为例):
初始状态:
pre=NULL current -> 10 -> 20 -> 30 -> NULL
第1次循环:
-
next = current->next;
(保存节点20,next
指向 20) -
current->next = pre;
(节点10的next</