algorithm-base/animation-simulation/链表篇/leetcode82删除排序链表中的重复元素II.md
2021-04-28 18:28:00 +08:00

107 lines
3.9 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

> 如果阅读时发现错误或者动画不可以显示的问题可以添加我微信好友 **[tan45du_one](https://raw.githubusercontent.com/tan45du/tan45du.github.io/master/个人微信.15egrcgqd94w.jpg)** ,备注 github + 题目 + 问题 向我反馈
>
> 感谢支持该仓库会一直维护希望对各位有一丢丢帮助
>
> 另外希望手机阅读的同学可以来我的 <u>[**公众号袁厨的算法小屋**](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u> 两个平台同步,想要和题友一起刷题,互相监督的同学,可以在我的小屋点击<u>[**刷题小队**](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u>进入。
#### [82. 删除排序链表中的重复元素 II](https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/)
题目描述
给定一个排序链表删除所有含有重复数字的节点只保留原始链表中没有重复出现的数字
示例 1:
```java
输入: 1->2->3->3->4->4->5
输出: 1->2->5
```
示例 2:
```java
输入: 1->1->1->2->3
输出: 2->3
```
> 注意这里会将重复的值全部删除1123最后只会保留23
这道题目还是很简单的更多的是考察大家的代码完整性删除节点也是题库中的一类题目我们可以可以通过这个题目举一反三去完成其他删除阶段的题目
链表的题目建议大家能有指针实现还是尽量用指针实现很多链表题目都可以利用辅助空间实现我们也可以用学会了那种方法的同时应该再想一下可不可以利用指针来完成下面我们来思考一下这个题目如何用指针实现吧
做题思路
这个题目也是利用我们的双指针思想一个走在前面一个在后面紧跟前面的指针就好比是侦察兵当发现重复节点时后面指针停止移动侦察兵继续移动直到移动完重复节点然后将该节点赋值给后节点思路是不是很简单啊那么我们来看一下动图模拟吧
这里为了表达更直观所以仅显示了该链表中存在的节点
![删除重复节点2](https://cdn.jsdelivr.net/gh/tan45du/photobed@master/photo/删除重复节点2.3btmii5cgxa0.gif)
**题目代码**
Java Code:
```java
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head == null||head.next==null){
return head;
}
ListNode pre = head;
ListNode low = new ListNode(0);
low.next = pre;
ListNode ret = new ListNode(-1);
ret = low;
while(pre != null && pre.next != null) {
if (pre.val == pre.next.val) {
while (pre != null && pre.next != null && pre.val == pre.next.val) {
pre = pre.next;
}
pre = pre.next;
low.next = pre;
}
else{
pre = pre.next;
low = low.next;
}
}
return ret.next;
}
}
```
C++ Code:
```cpp
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head == nullptr || head->next == nullptr){
return head;
}
ListNode * pre = head;
ListNode * low = new ListNode(0);
low->next = pre;
ListNode * ret = new ListNode(-1);
ret = low;
while(pre != nullptr && pre->next != nullptr) {
if (pre->val == pre->next->val) {
while (pre != nullptr && pre->next != nullptr && pre->val == pre->next->val) {
pre = pre->next;
}
pre = pre->next;
low->next = pre;
}
else{
pre = pre->next;
low = low->next;
}
}
return ret->next;
}
};
```