• 带头循环双向链表专题


    1. 双向链表的结构

    带头链表⾥的头节点,实际为“哨兵位”,哨兵位节点不存储任何有效元素,只是站在这⾥“放哨 的” “哨兵位”存在的意义: 遍历循环链表避免死循环。

    2. 双向链表的实现

    2.1双向链表结构

    1. typedef int DataType;
    2. typedef struct ListNode
    3. {
    4. struct ListNode* perv;
    5. DataType val;
    6. struct ListNode* next;
    7. }ListNode;

    双向链表有两个方向,所以要定义两个是指针,perv指向前一个节点,next指向后一个节点。

    2.2开辟新节点

    1. ListNode* NewNode(DataType x)
    2. {
    3. ListNode* note = (ListNode*)malloc(sizeof(ListNode));
    4. if (note == NULL)
    5. {
    6. perror("malloc");
    7. exit(0);
    8. }
    9. note->val = x;
    10. note->next = note->perv = note;
    11. return note;
    12. }

    当我们要插入新节点,或者初始化头结点时,需要开辟一个新节点。因为链表要循环,所以新节点的perv和next指针不能只想为NULL,要指向自己。

    2.3初始化链表

    1. void STInit(ListNode** pphead)
    2. {
    3. *pphead = NewNode(-1);
    4. }

    双向带头循环链表的初始化就是建立头节点(哨兵位)。随便赋一个值就可以。

    2.4双向链表头插

    1. void HeadAdd(ListNode* phead, DataType x)
    2. {
    3. assert(phead);
    4. ListNode* newnote = NewNode(x);
    5. newnote->next = phead->next;
    6. newnote->perv = phead;
    7. phead->next->perv = newnote;
    8. phead->next = newnote;
    9. }

    头插实际上是在头节点之后插入新节点。只需将新节点的perv指针指向phead,next指针指向phead->next节点。然后将phead->next的perv指针指向newnote。头节点的next指针指向新节点。

    2..5双向链表打印

    1. void ListPrint(ListNode* phead)
    2. {
    3. assert(phead);
    4. ListNode* pcur = phead->next;
    5. while (pcur != phead)
    6. {
    7. printf("%d->", pcur->val);
    8. pcur = pcur->next;
    9. }
    10. }

    双向链表的打印实际上是打印头节点之后的内容。先定义一个指针指向头结点的下一个节点。然后打印,最后让pcur指向下一个节点,重复这个过程,直到pcur指向phead。

    2.6尾插

    1. void TailAdd(ListNode* phead, DataType x)
    2. {
    3. assert(phead);
    4. ListNode* newnode = NewNode(x);
    5. newnode->next = phead;
    6. newnode->perv = phead->perv;
    7. newnode->perv->next = newnode;
    8. phead->perv = newnode;
    9. }

    双向链表的尾插,首先要向内存申请一个新节点。新节点的perv指针指向phead->perv节点,next指针指向phead节点。phead->perv的next指针指向新节点。头结点的perv节点指向新节点。

    2.7尾删

    1. void TailDel(ListNode* phead)
    2. {
    3. assert(phead && phead->next != phead);
    4. ListNode* del = phead->perv;
    5. del->perv->next = phead;
    6. phead->perv = del->perv;
    7. free(del);
    8. del = NULL;
    9. }

    先将要删除的节点的地址存起来,否则改完指针指向后就找不到了。改完指针指向后再释放del。

    2.8头删

    1. void HeadDel(ListNode* phead)
    2. {
    3. assert(phead && phead->next != phead);
    4. ListNode* del = phead->next;
    5. del->next->perv = phead;
    6. phead->next = del->next;
    7. free(del);
    8. del = NULL;
    9. }

    头删即删除头节点之后的节点。同样要先把要删除的节点存起来。在改变指针指向之后把del释放。

    2.9查找某一结点是否存在

    1. ListNode* Find(ListNode* phead, DataType x)
    2. {
    3. assert(phead);
    4. ListNode* pcur = phead->next;
    5. while (pcur != phead)
    6. {
    7. if (pcur->val == x)
    8. {
    9. return pcur;
    10. }
    11. }
    12. return -1;
    13. }

    遍历链表,查找某节点是否存在,如果存在则返回该节点的地址,若不存在返回一个小于0的值。

    2.10在指定位置指点之后插入节点

    1. void PosBAdd(ListNode* pop, DataType x)
    2. {
    3. ListNode* newnode = NewNode(x);
    4. newnode->next = pop->next;
    5. newnode->perv = pop;
    6. pop->next->perv = newnode;
    7. pop->next = newnode;
    8. }

    同样也是简单的改变指针的指向。

    2.11删除指定位置节点

    1. void PosDel(ListNode* pop)
    2. {
    3. pop->perv->next = pop->next;
    4. pop->next->perv = pop->perv;
    5. free(pop);
    6. pop = NULL;
    7. }

    改变指针指向后在释放掉要删除的节点。

    2.12销毁链表

    1. void ListDesTroy(ListNode* phead)
    2. {
    3. ListNode* pcur = phead->next;
    4. while (pcur != phead)
    5. {
    6. ListNode* next = pcur->next;
    7. free(pcur);
    8. pcur = next;
    9. }
    10. }

    销毁链表即逐个节点释放,但是在释放结点之前要先将下一个结点的地址存起来,因为如果不存起来就无法找到下一个节点。

  • 相关阅读:
    UE5 局域网联机,寻找会话失败。
    【Text2SQL 论文】DBCopilot:将 NL 查询扩展到大规模数据库
    鸿蒙HarmonyOS实战-Web组件(基本使用和属性)
    xxl-job做集群的时候,用F5做负载均衡效率高还是直接写死几个服务器地址的效率高?
    天池AI练习生计划 - 第一期Pyhton入门与实践 正式上线!通关赢取双重礼品!
    吃透Redis(六):网络框架篇-redis框架源码
    光伏系统MPPT、恒功率控制切换Simulink仿真
    一文了解BeanNameGenerator
    C/C++ 每日一练:计算斐波那契数列的第 n 项(递归、记忆化、迭代)
    Brew包的基本安装(手把手教学)
  • 原文地址:https://blog.csdn.net/uvrdes56dd6/article/details/137915942