【LeetCode刷题笔记-83 82:删除排序链表中的重复元素】

在这里插入图片描述
讲道理,今天这道题我觉得题解在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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值