• Leetcode_203.移除链表元素—C语言


    目录

    ❣️1.题目❣️

    ❣️2.解答❣️

    💞方法一:暴力法

    💞方法二: 尾插法

    💞方法三:哨兵位法


    ❣️1.题目❣️

    给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

    示例 1:

    输入:head = [1,2,6,3,4,5,6], val = 6
    输出:[1,2,3,4,5]
    

    示例 2:

    输入:head = [], val = 1
    输出:[]
    

    示例 3:

    输入:head = [7,7,7,7], val = 7
    输出:[]
    

    提示:

    • 列表中的节点数目在范围 [0, 104] 内
    • 1 <= Node.val <= 50
    • 0 <= val <= 50

    ❣️2.解答❣️

    💞方法一:暴力法

    算法思路:

    遍历链表,如果当前节点的值等于val,则删除该节点,并且修改前驱节点的next指针指向后继节点。如果当前节点的值不等于val,则将前驱节点指向当前节点,当前节点指向下一个节点。

    具体实现:

    使用两个指针prev和cur,分别指向前驱节点和当前节点。开始遍历前,先初始化prev为NULL,cur为head,即第一个节点。然后进行while循环,当cur指向NULL时停止。在循环中,如果cur指向的节点的值等于val,则删除该节点,将后继节点指针保存在next中。如果prev不为NULL,则修改prev的next指针指向next;否则,说明删除的是头节点,直接修改head为next。最后,将cur指向next,继续下一轮循环。如果cur指向的节点的值不等于val,则将prev指向cur,cur指向下一个节点。最后,返回head指针。

    需要注意的是,在删除节点后,需要使用free函数释放该节点的内存空间。

    1. struct ListNode* removeElements(struct ListNode* head, int val)
    2. {
    3. struct ListNode* prev = NULL;
    4. struct ListNode* cur = head;
    5. //while(cur !=NULL)
    6. while (cur)
    7. {
    8. if (cur->val == val)
    9. {
    10. struct ListNode* next = cur->next;
    11. free(cur);
    12. if (prev)
    13. prev->next = next;
    14. else
    15. head = next;
    16. cur = next;
    17. }
    18. else
    19. {
    20. prev = cur;
    21. cur = cur->next;
    22. }
    23. }
    24. return head;
    25. }

    💞方法二: 尾插法

    首先定义了三个指针:newhead、tail 和 cur,其中 newhead 和 tail 用于构建新的链表,cur 用于遍历原链表。初始时,newhead 和 tail 都指向 NULL,cur 指向原链表的头结点 head。

    然后进入 while 循环,循环条件为 cur 不为 NULL。在循环体中,首先判断 cur 的值是否等于 val,如果等于,说明需要删除该节点,因此先将该节点的空间释放,然后将 cur 指向下一个节点。如果不等于,说明该节点需要保留,因此将该节点从原链表中取下来,并使用尾插法将其插入到新链表的尾部。具体地,若 tail 为 NULL,则说明此时新链表还没有节点,因此将 newhead 和 tail 都指向当前节点;否则,将当前节点插入到 tail 的后面,并更新 tail 指向新的尾节点。最后, cur 指向下一个节点,继续进行循环。

    当循环结束时,所有不等于 val 的节点都已经被插入到了新链表中。此时需要检查一下 tail 是否为空,如果不为空,则将 tail 的 next 指针置为 NULL,表示新链表的最后一个节点已经插入完毕。最后,返回新链表的头结点 newhead。

    1. struct ListNode*removeElements(struct ListNode* head,int val)
    2. {
    3. struct ListNode*newhead =NULL,*tail=NULL;
    4. struct ListNode*cur =head;
    5. while(cur)
    6. {
    7. //不是val的节点取下来尾插
    8. if(cur->val !=val)
    9. {
    10. //尾插
    11. if(tail ==NULL)
    12. newhead =tail =cur;
    13. else
    14. {
    15. tail->next =cur;
    16. tail=tail->next;
    17. }
    18. cur =cur->next;
    19. }
    20. else
    21. {
    22. struct ListNode*tmp =cur;
    23. cur =cur->next;
    24. free(tmp);
    25. }
    26. }
    27. if(tail)
    28. tail->next =NULL;
    29. return newhead;
    30. }

    💞方法三:哨兵位法

    首先定义一个哨兵位,作为新链表的头节点,同时也是一个尾指针,用于删除操作后将尾部节点的next指针置为NULL。

    接下来遍历链表,如果当前节点的值不是val,则将其从原链表取下来,尾插到新链表中;如果当前节点的值是val,则将其从原链表中删除。

    最后,将哨兵位删除,返回新链表的头节点即可。

    1. struct ListNode* removeElements(struct ListNode* head, int val)
    2. {
    3. struct ListNode* newhead = NULL,*tail = NULL;
    4. struct ListNode* cur = head;
    5. // 哨兵位
    6. newhead = tail =(struct ListNode*)malloc(sizeof(struct ListNode));
    7. while(cur)
    8. {
    9. // 不是va1的节点取下来尾插
    10. if(cur->val != val)
    11. {
    12. // 尾插
    13. tail->next = cur;
    14. tail = tail->next;
    15. cur = cur->next;
    16. }
    17. else
    18. {
    19. struct ListNode* tmp = cur;
    20. cur = cur->next;
    21. free(tmp);
    22. }
    23. }
    24. tail->next = NULL;
    25. struct ListNode* tmp = newhead;newhead = newhead->next;
    26. free(tmp);
    27. return newhead;
    28. }

  • 相关阅读:
    TFTP服务器,NFS服务器
    服务器硬件的基础知识
    虚拟人能否代替直播带货?
    【总结】linux centos 7 开启网络白名单访问策略
    python — 上下文管理器(例子:python连接数据库)
    软考-软件工程
    css学习——sass(6)
    微信小程序在线考试项目开发-用户授权登录、身份信息获取
    1475_AURIX TC275 WDT的寄存器概览
    生硬的营销,比不搞还糟。有感于花点时间的市场活动
  • 原文地址:https://blog.csdn.net/2303_77720864/article/details/134360416