记录 2021.8.12 删除排序链表中的重复元素 II(med)
题目:
存在一个按升序排列的链表,给你这个链表的头节点 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
题目数据保证链表已经按升序排列
Related Topics 链表 双指针
👍 676 👎 0
思路:
此题和删除排序链表中的重复元素1不同,1可以说是去重,而2是将有重复的元素全部删除。
我们惯例使用一个哑结点,方便头结点被删除的情况。设一个temp值记录重复元素的值,
如果当前结点和它下一个结点值相等,将值赋给temp,然后从当前结点开始循环,每次当前结点不为空
且值等于temp时,就移动到下一节点,直到不满足条件为止。如果当前结点和它一个结点值不等,则当前结点
直接移动到下一节点即可。最后返回哑结点的next,
代码:
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head==null){
return null;
}
ListNode preNode = new ListNode(0,head);
ListNode ans = preNode;
int temp=200;
while (preNode.next!=null&&preNode.next.next!=null){
if(preNode.next.val==preNode.next.next.val){
temp=preNode.next.val;
while (preNode.next!=null&&preNode.next.val==temp){
preNode.next=preNode.next.next;
}
}else{
preNode=preNode.next;
}
}
return ans.next;
}
}