82. 删除排序链表中的重复元素 II
难度 中等
给定一个已排序的链表的头 head
, 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。
示例 1:
输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]
示例 2:
输入:head = [1,1,1,2,3]
输出:[2,3]
提示:
- 链表中节点数目在范围
[0, 300]
内 -100 <= Node.val <= 100
- 题目数据保证链表已经按升序 排列
题解
这道题应该是一道简单的指针操作题,主要通过移动和判断进行。移动时回遇到两种情况,一是当前指针和后面的指针不相同,直接移动指针;二是当前指针和后面的指针相同,要跳过所有指针。所以就针对这两种情况进行判断,然后选择不同的操作。
为了便于理解,需要设置几个辅助变量
- headNode,头节点,区别头指针head。头结点是为了方便返回结果
- pre,前驱指针,记录当前节点的前一个指针,方便修改指针
- now,当前指针,进行移动和判断
- next,后继指针,进行移动和判断
现在有两个不同的情况
-
当前指针和后续指针不相同
指针移动当前指针和前驱指针,pre = now; now = next;
-
当前指针和后续指针相同
如果相同了,后面还有可能相同,要一并处理,更新next = next.next; 继续判断,直到不相同(直接while循环)。当判断结束后,pre.next要指向next,再更新now = next。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
//此版本代码不是最优代码,当时一定是好理解的代码
class Solution {
public ListNode deleteDuplicates(ListNode head) {
ListNode hendNode = new ListNode(0, head);//头节点,方便返回
ListNode pre = hendNode;//前驱指针
ListNode now = pre.next;//当前指针
while(now != null){//当前指针不为空
ListNode next = now.next;//后继指针
if(next != null){//后继指针不为空
if(now.val == next.val){//当当前指针和后续指针相同
while(next != null && now.val == next.val){//后续不为空,且一直相同
next = next.next;//更新next,直到第一个不相同的
}
pre.next = next;//pre.next指向next,跳过一系列相同节点
now = next;//当前指针移动
}else{//如果不相同,直接移动前驱指针和当前指针
pre = now;
now = next;
}
}else{//猴急指针为空,直接结束循环
break;
}
}
return hendNode.next;//返回头结点后续节点
}
}