力扣82. 删除排序链表中的重复元素 II(快慢指针)

力扣82. 删除排序链表中的重复元素 II(快慢指针)

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

给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。

示例 1:

输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:

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

快慢指针

思路

  • 快指针:跳过重复数,记录下一个前面没有重复数的节点位置
  • 慢指针:标记重复数字出现起点,根据链表特性,负责与下一个快指针相连
#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)
	{
		if (head == nullptr || head->next == nullptr)return head;
		ListNode* result = new ListNode(0);
		result->next = head;
		ListNode* last = result;
		ListNode* cur = result->next;
		//遍历
		while (cur->next != nullptr)
		{
			//遇到不相同,跳过
			if (cur->val != cur->next->val)
			{
				last = cur;
				cur = cur->next;
				continue;
			}
			
			else
			{
				//相同,删除
				while (cur->val == cur->next->val)
				{
					cur = cur->next;
					//尾节点,特殊考虑
					if (cur->next ==nullptr)
					{
						last->next = nullptr;
						return result->next;
					}
				}
				cur = cur->next;
				last->next = cur;
			}
		}
		return result->next;
	}
};

int main()
{
	Solution s;
	ListNode head[7] = { 1,2,3,3,4,5,5 };
	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[5].next = &head[6];
	ListNode* out1 = head;
	while (out1)
	{
		cout << out1->val << '\t';
		out1 = out1->next;
	}
	cout << '\n';
	auto result1 = s.deleteDuplicates(head);
	ListNode* out2 = result1;
	while (out2)
	{
		cout << out2->val << '\t';
		out2 = out2->next;
	}
	cout << '\n';
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_35683407/article/details/105845326