讲道理,今天这道题我觉得题解在C++上并不严谨。因为删除的节点没有使用delete去删除。
但是我使用了delete反而还报了内存溢出的错误,在我的再三检查之下,依旧没有发现问题出在哪里。毕竟我自己这边编译器是能跑通的。
所以对于C++来说,对比起题解代码,我更愿意展示我自己的处理了内存的代码。
思路很简单,就是很基本的链表操作。使用一个哑节点去处理整条链表。
C++代码:附带测试
#include<iostream>
using namespace std;
struct ListNode{
int val;
ListNode* next;
ListNode(int val):val(val),next(nullptr){}
ListNode(int x,ListNode* next):val(x),next(next){}
};
ListNode* create(){
ListNode* head = new ListNode(0);
ListNode* ptr = head;
int arr[] = {1,2,3,3,4,4,5};
int n = sizeof(arr)/sizeof(int);
for(int i=0;i<n;i++){
ListNode *p = new ListNode(arr[i]);
ptr->next = p;
ptr = ptr->next;
}
return head;
}
void display(ListNode* head){
ListNode* ptr = head;
while(ptr!=nullptr){
cout<<ptr->val<<" ";
ptr = ptr->next;
}
cout<<endl;
}
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
ListNode* suphead = new ListNode(0);//建立一个辅助节点
suphead->next = head;
ListNode* ptr = suphead;
ListNode* pre = head;
ListNode* cur = head->next;
while(cur!=nullptr){
if(cur->val!=pre->val){
ptr->next = pre;
ptr = ptr->next;
pre = cur;
cur = cur->next;
}else{
while(cur!=nullptr&&cur->val==pre->val){
cur = cur->next;
}
while(pre!=cur){
ListNode *p = pre->next;
delete p;
pre = p;
}
if(pre==nullptr){
break;
}
cur = pre->next;
}
}
ptr->next = pre;
delete suphead;
return head;
}
};
int main(){
ListNode* head = create();
display(head);
Solution solution;
head = solution.deleteDuplicates(head->next);
display(head);
}