头文件:linklist.h
#ifndef __LINKLIST_H__
#define __LINKLIST_H__
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
typedef int DataType;
//单链表的类型:每个节点包含一个数据和一个指针,指针指向下一个节点
typedef struct Node
{
struct Node *pnext;
DataType date;
}Node, *PNode;
//初始化单链表
void InitSeqList(PNode *pHead);
//删除一个非尾节点
void DeleteNotTail(PNode pos);
// 尾插
void PushBack(PNode *pHead, DataType data);
// 尾删
void PopBack(PNode *pHead);
// 打印顺序表
void PrintSeqList(PNode pHead);
// 头插
void PushFront(PNode *pHead, DataType data);
// 头删
void PopFront(PNode *pHead);
// 在顺单链表中查找元素data
PNode Find(PNode pHead, DataType data);
// 删除单链表中pos位置上的元素
void Erase(PNode *pHead, PNode pos);
//移除单链表中的元素data
void Remove(PNode *pHead, DataType data);
// 移除单链表中所有元素data
void RemoveAll(PNode *pHead, DataType data);
//从尾到前打印所有元素
void printfFromTailToHead(PNode pHead);
//在指定位置插入指定值的节点
void Insert(PNode* pHead, PNode pos, DataType data);
//查找中间元素
PNode FindMid(PNode pHead);
//在单链表的一个非头节点前插入一个节点(不遍历单链表)
void InsertNotHeadNode(PNode pos, DataType data);
//////////////////////面试题//////////////////////////////////////
//1. 比较顺序表和链表的优缺点,说说它们分别在什么场景下使用?
//2. 从尾到头打印单链表
//void PrintListFormTailToHead(PNode pHead);
//3. 删除一个无头单链表的非尾节点
//void DeleteNotTailNode(PNode pos);
//4. 在无头单链表的一个非头节点前插入一个节点
//void InsertNotHeadNode(PNode pos, DataType data);
//5. 单链表实现约瑟夫环(JosephCircle)
//6. 逆置 / 反转单链表
//7. 单链表排序(冒泡排序&快速排序)
//8. 合并两个有序链表, 合并后依然有序
//9. 查找单链表的中间节点,要求只能遍历一次链表
//PNode FindMidNode(PNode pHead);
//10. 查找单链表的倒数第k个节点,要求只能遍历一次链表
//11. 判断单链表是否带环?若带环,求环的长度?求环的入口点?并计算每个算法的时间复杂度&空间复杂度。
//12. 判断两个链表是否相交,若相交,求交点。(假设链表不带环)
//13. 判断两个链表是否相交,若相交,求交点。(假设链表可能带环)【升级版】
//14. 复杂链表的复制。一个链表的每个节点,有一个指向next指针指向下一个节点,还有一个random指针指向这个链表中的一个随机节点或者NULL,现在要求实现复制这个链表,返回复制后的新链表。
//15. 求两个已排序单链表中相同的数据。void UnionSet(Node* l1, Node* l2);
//
//
//
//* 比较顺序表和链表的优缺点,他们分别在什么场景下使用它。
//
//
//1. 顺序表支持随机访问,单链表不支持随机访问。
//2. 顺序表插入 / 删除数据效率很低,时间复杂度为O(N)(除尾插尾删),单链表插入 / 删除效率更高,时间复杂度为O(1)。
//3. 顺序表的CPU高速缓存效率更高,单链表CPU高速缓存效率低。
#endif
linklist.c
#include "linklist.h"