• 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. };
  • 相关阅读:
    如何使用Spring和Thymeleaf轻松地在HTML表单映射上显示多个复选框
    HTML(基本标签)
    JS ||(或运算)详解
    唧唧down怎么下载安装-唧唧down使用操作内容讲解
    cesium实现水面水流及淹没效果绘制的封装
    【数据结构】树与二叉树
    应用升级SpringCloud版本时的注意事项(Dalston升级到Edgware)
    基础算法之分治
    vector 用法 说明
    【JavaWeb - 网页编程】五 书城项目
  • 原文地址:https://blog.csdn.net/zjjaibc/article/details/126923818