力扣 C++11题解系列-082 删除排序链表中的重复元素

力扣C++11题解系列-082删除排序链表中的重复元素

题目

给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。

示例1:

输入: 1->1->2
输出: 1->2
示例2:

输入: 1->1->2->3->3
输出: 1->2->3

解题代码与测试

//
// Created by tannzh on 2020/8/20.
//

/*
 * 删除排序链表中的重复元素
 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。

示例1:

输入: 1->1->2
输出: 1->2
示例2:

输入: 1->1->2->3->3
输出: 1->2->3

 */

#include <iostream>
#include <vector>

using std::vector;
using vecIter = vector<int>::iterator;

//Definition for singly-linked list.
struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(nullptr) {}
};

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        for (ListNode *cur = head; cur && cur->next; ){
            if (cur->val == cur->next->val){
                ListNode *del = cur->next;
                cur->next = del->next;
                delete del;
            }
            else cur = cur->next;
        }
        return head;
    }
};

ListNode *createLinkedList(vecIter beg, vecIter end)
{
    ListNode *head = beg == end ? NULL : new ListNode(*beg++);
    for (ListNode *cur = head; beg != end; cur = cur->next)
        cur->next = new ListNode(*beg++);
    return head;
}

void printAndClear(ListNode *head)
{
    while (head)
    {
        std::cout << head->val;
        if (head->next) std::cout << "->";
        ListNode *del = head;
        head = head->next;
        delete del;
    }
    std::cout << std::endl;
}

int main()
{
    vector<int> vec = {1,1,2};
    vector<int> vec1 = {1,1,2,3,3};

    ListNode *head = createLinkedList(vec.begin(), vec.end());
    ListNode *head1 = createLinkedList(vec1.begin(), vec1.end());

    Solution s;
    ListNode *res = s.deleteDuplicates(head);
    ListNode *res1 = s.deleteDuplicates(head1);

    printAndClear(res);
    printAndClear(res1);

    return 0;
}



解题思路分析

这题目还是很基础, 本不需要说什么, 但后来看了 Discuss 之后, 发现大家还关注内存回收的问题. 删去的节点, 应该被 delete. 这是对的. 我开始却给自动忽略了.

这造成的问题就是, 测试主函数中, 每一个节点必须要 new 出来, 而不能仅仅像以前一样, 声明一个局部对象. (当然, 这样做就是为了避免回收内存, 图简单.) 否则你 delete 的时候必然会造成内存错误的.