链表基础知识总结
inux内核中经典链表 list_head 常见函数:初始+2个添加+删除+链表遍历
判空
单向不带头结点链表 head==NULL
单向带头结点 head->next=NULL
单向循环不带头结点 head==NULL
单向循环带头结点 head->next=head
头指针=指针
头结点=数据域data【链表的长度、监视哨】+指针next
有时,链表以首元结点作为第一个元素,而不是头指针。
typedef struct LinkList//单链表
{
int Element;
LinkList * next;
}LinkList;
typedef struct LinkList//双链表 linux自带链表的形式 而前后向指针和数据并列存放的形式更为多见
{
int Element;
Link *next;
{
LinkList *prev;
LinkList *next;
}
}LinkList;
1、创建链表节点
linklist *HeadNode= (linklist*)malloc(sizeof(linklist));
if(HeadNode == NULL) //mallo后一定要检查是否申请成功
{
printf("空间缓存不足\n");
return HeadNode;
}
HeadNode.next=NULL;
2、插入链表结点
①在链表尾部插入
②为在中间插入【在指定节点前/后插入】
3、删除链表结点
前节点preNode→→待删除节点CurrentNode→→后节点nextNode
1、获取待删除节点*p→CurrentNode
2、建立前后节点的连接:
preNode ->next = preNode ->next->next;
nextNode→prev=nextNode→prev→prev;
3、free(p);
4、链表长度、遍历、判断环等处理
获取链表长度&链表遍历
获取链表元素
链表置空
链表逆序
链表判断是否有环
首先,关于单链表中的环,一般涉及到一下问题:
1.给一个单链表,判断其中是否有环的存在;
2.如果存在环,找出环的入口点;
3.如果存在环,求出环上节点的个数;
4.如果存在环,求出链表的长度;
5.如果存在环,求出环上距离任意一个节点最远的点(对面节点);
6.(扩展)如何判断两个无环链表是否相交;
7.(扩展)如果相交,求出第一个相交的节点;
链表与环的判断
1、查询链表是否有环
快慢指针:
开始的时候两个指针都指向链表头head
每次操作时:slow走一步:slow = slow->next
fast走两步:fast = fast->next->next
若有环则必定会相遇