力扣83. 删除排序链表中的重复元素(链表操作)

本文详细解析了力扣第83题“删除排序链表中的重复元素”的解题思路和算法实现,通过示例展示了如何遍历链表并删除重复元素,确保每个元素仅出现一次,提供了一个简洁高效的解决方案。

力扣83. 删除排序链表中的重复元素(链表操作)

https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list/

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

示例 1:

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

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

 

思路:

//如果重复元素,则last指针不变,phead往右移一,跳过重复元素

//如果不是重复元素,则last和phead都要往右移一

复杂度分析:

时间复杂度:O(n),因为列表中的每个结点都检查一次以确定它是否重复,所以总运行时间为 O(n),其中 nn 是列表中的结点数。

空间复杂度:O(1),没有使用额外的空间。

#include "stdafx.h"
#include <iostream>
using namespace std;
struct ListNode 
{
     int val;
     ListNode *next;
     ListNode(int x) : val(x), next(NULL) {}
};

class Solution 
{
public:
	ListNode* deleteDuplicates(ListNode* head) 
	{
		//鲁棒性,如果head为空,则返回空
		if (head == nullptr) return head;
		//last从第一个结点开始,因为如果只有一个结点的话,不会删除
		ListNode* last = head;
		//当前结点phead,从第二个结点(可能是空结点)开始
		ListNode* phead = head->next;
		//循环结束条件是当前结点到末尾,如果没到末尾就继续循环
		while (phead)
		{
			//如果重复元素,则last指针不变,phead往右移一,跳过重复元素
			if (phead->val== last->val)
			{
				last->next = phead->next;
				phead = phead->next;
			}
			//如果不是重复元素,则last和phead都要往右移一
			else
			{
				last = phead;
				phead = phead->next;
			}
		}
		return head;
	}
};

int main()
{
	ListNode head[7] = { 1, 2, 2, 2, 8, 8, 8 };
	head[0].next = &head[1]; head[1].next = &head[2]; head[2].next = &head[3];
	head[3].next = &head[4]; head[4].next = &head[5]; head[6].next = &head[7];
	cout << "原链表:"<<'\n';
	ListNode* headtemp = head;
	while (headtemp)
	{
		cout << headtemp->val << '\t';
		headtemp = headtemp->next;
	}
	cout << '\n' << "删除重复链表:" << '\n';
	Solution s;
	auto result = s.deleteDuplicates(head);
	ListNode* resulttemp = result;
	while (resulttemp)
	{
		cout << resulttemp->val << '\t';
		resulttemp = resulttemp->next;
	}
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值