• lc[链表]---203.移除链表元素


    一、题目描述

    数据结构类型声明:

    1. /**
    2. * Definition for singly-linked list.
    3. * struct ListNode {
    4. * int val;
    5. * ListNode *next;
    6. * ListNode() : val(0), next(nullptr) {}
    7. * ListNode(int x) : val(x), next(nullptr) {}
    8. * ListNode(int x, ListNode *next) : val(x), next(next) {}
    9. * };
    10. */

     本人ac代码(当做无头链表来处理--->分成是否是头结点分别去处理即可。)

    1. class Solution
    2. {
    3. public:
    4. ListNode* removeElements(ListNode* head, int val)
    5. {
    6. ListNode* pre=head;
    7. ListNode *pMove=head;
    8. while(pMove!=nullptr)
    9. {
    10. if(pMove==head&&pMove->val==val)
    11. {//要删除的是头结点
    12. ListNode *tmp=head;
    13. head=head->next;
    14. delete tmp;
    15. tmp=nullptr;
    16. pre=head;//++
    17. pMove=head;
    18. continue;
    19. }
    20. else if(pMove->val==val)
    21. {
    22. ListNode*tmp=pMove;
    23. pre->next=pMove->next;
    24. pMove=pMove->next;
    25. delete tmp;
    26. tmp=nullptr;
    27. continue;
    28. }
    29. pre=pMove;//++
    30. pMove=pMove->next;
    31. }
    32. return head;
    33. }
    34. };

    再做此题的时候,遇到了"heap use after free address"问题:

    1. class Solution
    2. {
    3. public:
    4. ListNode* removeElements(ListNode* head, int val)
    5. {
    6. ListNode* pre=head;
    7. ListNode *pMove=head;
    8. while(pMove!=nullptr)
    9. {
    10. if(pMove==head&&pMove->val==val)
    11. {//要删除的是头结点
    12. ListNode *tmp=head;
    13. head=head->next;
    14. delete tmp;
    15. tmp=nullptr;
    16. }
    17. else if(pMove->val==val)
    18. {
    19. ListNode*tmp=pMove;
    20. pre->next=pMove->next;
    21. delete tmp;
    22. tmp=nullptr;
    23. }
    24. pre=pMove;//++
    25. pMove=pMove->next;
    26. }
    27. return head;
    28. }
    29. };

    问题大概出现在,比如当年你删除掉头结点的时候,pre和pMove还是指在原来那个被删除的结点上面,所以导致这样的问题(注意删除相应节点之后,要及时对pre和pMove更新即可.)--->修正代码见上。

    二、其他写法-----有头链表(统一对删除结点的操作)

    1. class Solution {
    2. public:
    3. ListNode* removeElements(ListNode* head, int val) {
    4. ListNode* dummyHead = new ListNode(0); // 设置一个虚拟头结点
    5. dummyHead->next = head; // 将虚拟头结点指向head,这样方面后面做删除操作
    6. ListNode* cur = dummyHead;
    7. while (cur->next != NULL) {
    8. if(cur->next->val == val) {
    9. ListNode* tmp = cur->next;
    10. cur->next = cur->next->next;
    11. delete tmp;
    12. } else {
    13. cur = cur->next;
    14. }
    15. }
    16. head = dummyHead->next;
    17. delete dummyHead;
    18. return head;
    19. }
    20. };
  • 相关阅读:
    基于STM32单片机的PT100测温(AD转换)(Proteus仿真+程序)
    (附源码)基于Springboot智慧园区管理系统-计算机毕设 88160
    Appium的使用教程
    Web Cache Deception
    【项目问题定位】前端请求不到资源报错ERR_CONTENT_LENGTH_MISMATCH的解决
    JAVA计算机毕业设计在线专业培养方案系统Mybatis+源码+数据库+lw文档+系统+调试部署
    TCP协议
    元梦之星内测上线,如何在B站打响声量?
    redis 发布者订阅者实例
    LCD的映射mmap()、GEC6818开发板刷图
  • 原文地址:https://blog.csdn.net/zjjaibc/article/details/126923818