1. 链表基础与LeetCode刷题入门
作为一名程序员,刷算法题是提升编码能力的必经之路。而链表作为数据结构中最基础也最重要的部分之一,往往是算法入门的最佳选择。我最近重新开始刷LeetCode,决定从链表相关的简单题目入手,一方面熟悉平台操作,另一方面巩固链表的基础知识。
链表是由一系列节点组成的数据结构,每个节点包含数据和指向下一个节点的指针。与数组不同,链表在内存中不是连续存储的,这使得它在插入和删除操作上具有优势,但访问特定位置的元素则需要从头遍历,效率较低。
在开始刷题前,我们需要先掌握链表的基本操作:
- 创建和遍历链表
- 在链表头部/尾部插入节点
- 删除指定节点
- 反转链表
- 检测链表是否有环
这些基本操作是解决更复杂链表问题的基础。在LeetCode上,链表相关的题目通常会给出链表节点的定义,如下所示:
c复制struct ListNode {
int val;
struct ListNode *next;
};
理解这个结构体定义是解决链表问题的第一步。val存储节点的值,next指针指向下一个节点,最后一个节点的next为NULL。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 移除链表元素(LeetCode 203)
2.1 问题描述与初步解法
第一个题目是移除链表中所有值等于给定val的节点。我的第一版代码如下:
c复制struct ListNode* removeElements(struct ListNode* head, int val) {
struct ListNode *p,*pre;
while (head != NULL && head->val == val) {
struct ListNode* temp = head;
head = head->next;
free(temp);
}
if(head == NULL){
return head;
}
pre = head;
p = head->next;
while(p != NULL){
if(val == p->val){
pre->next
