力扣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;
}