• 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. };
  • 相关阅读:
    UI Toolkit 计时器
    python 处理excel 识别图片文字 转换成表格内容输出
    安装Elasticsearch步骤(包含遇到的问题及解决方案)
    excel制作透视表
    一年后斩获腾讯T5,这份呕心之作Java学习笔记有多厉害
    turn.js 模版简单使用
    QT day5
    戴尔PowerEdge服务器R450 RAID配置步骤
    【MySQL进阶】深入理解InnoDB记录结构
    将base64格式的图片画到canvas上(js和vue两种)
  • 原文地址:https://blog.csdn.net/zjjaibc/article/details/126923818