目录导航
- 1. 删除链表中给定值为val的所有节点
- 2. 反转一个单链表
- 3. 返回链表中间节点&返回链表倒数第k个节点
- 4. 链表的回文结构
- 5. 合并两个有序链表
- 6. 输入两个链表,找出它们第一个公共节点
- 7. 分割链表
- 8. 判断链表是否带环&找环的入口点
- 9. 复制复杂链表
- 10. 调试文件
这篇目录导航主要目的之一是方便自己以后复习用,都是非常经典的题目。唯一不同的是,下面最后我调试文件贴出来,数据结构很锻炼调试能力,方便大家自己做题出问题时调试,思路没问题情况下,要坚信自己能调出来。每篇文章都包含了,题目链接、思路分析、题解以及sometimes小边独家反思。
小边碎碎念:目前链表极其经典的题目已经更完了,基本上是增删查改的熟练运用,会发现很多题目都是悄悄含着别的题目的影子。比如判断链表是否带环,快慢指针同样是快指针走两步慢指针走一步,其中就含着快慢指针经典题目,寻找返回链表中点,终止条件的判断需要分奇偶数个节点讨论;比如昨天的回文链表,又内含着寻找中间节点,反转单链表这样经典的题目。有一些题目就是分上下集的小故事,有些可以对比一下,有一点小小经验,它们都写在各个文章里了。
这就是经典题目的意义吧,如果不够熟悉,就可能想不到,或者一写就写出小错误,我们不可能背下来它们,但要能做到,拿到之后就能快速正确分析。
正文开始@边通书
1. 删除链表中给定值为val的所有节点
文章链接:小题解
2. 反转一个单链表
文章链接:小题解
3. 返回链表中间节点&返回链表倒数第k个节点
文章链接:小题解
4. 链表的回文结构
文章链接:小题解
5. 合并两个有序链表
文章链接:小题解
6. 输入两个链表,找出它们第一个公共节点
文章链接:小题解
7. 分割链表
文章链接:小题解
8. 判断链表是否带环&找环的入口点
文章链接:小题解
9. 复制复杂链表
文章链接:小题解
10. 调试文件
其实就是自己根据需求手动尾插构建链表,打开监视、内存观察即可。一般错误都能自己调出来。
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>typedef int SListDataType;typedef struct SListNode
{SListDataType data;struct SListNode* next;
}SLTNode;void SListPrint(SLTNode* phead)
{SLTNode* cur = phead;while (cur){printf("%d ", cur->data);cur = cur->next;}printf("\n");
}void SListDestroy(SLTNode** pphead)
{// 这个链表是// 链表的空间必须遍历回收,因为申请时候就不连续SLTNode* cur = *pphead;SLTNode* next = cur->next;// 记录下一个节点的位置while (next){free(cur);cur = next;next = cur->next;}*pphead = NULL;
}//申请新节点
SLTNode* BuyListNode(SListDataType x)
{SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));if (newnode == NULL){printf("malloc failed\n");exit(-1);}newnode->data = x;newnode->next = NULL;return newnode;
}void SListPushBack(SLTNode** pphead, SListDataType x)
{assert(pphead);SLTNode* newnode = BuyListNode(x);//1.空链表 - 尾插头结点的地址pList发生改变,因此需要传pList的地址// **ppheadif (*pphead == NULL){*pphead = newnode;return;}//找尾SLTNode* tail = *pphead;while (tail->next != NULL){tail = tail->next;}tail->next = newnode;
}int main()
{//根据需求尾插构造一个即可return 0;
}