[LeetCode]82. 删除排序链表中的重复元素 II(java实现)链表双指针
1. 题目
2. 读题(需要重点注意的东西)
思路:
注意: 有重复则把重复的元素全部删掉
-
用指针p指向上一个没有重复的元素的位置
-
p如果有下一段,则进行如下判断:
-
当p.next和q = p.next.next的值相等时,q向后走一步
-
当p.next和指针q的值不同时,判断,如果p.next.next= q,则说明q没有走过,即下一段只有一个节点,则p向后走一步即可;
-
否则将下一段删掉:p.next = q;
3. 解法
---------------------------------------------------解法---------------------------------------------------
/**
* 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) {
// 虚拟头结点
var dummy = new ListNode(-1);
dummy.next = head;
// 指针p指向上一个没有重复的元素的位置
var p = dummy;
// 如果有下一段,即p.next != null时
while(p.next != null){
// q指向下一段的第二个数
var q = p.next.next;
// 如果q存在,且q.val == p.next.val,q向后走一步
while(q != null && q.val == p.next.val) q = q.next;
// 如果下一段只有一个元素(即没有不同的元素),p才会走到下一个位置
if(p.next.next == q) p = p.next;
// 否则将下一段删除
else p.next = q;
}
return dummy.next;
}
}
可能存在的问题:
4. 可能有帮助的前置习题
5. 所用到的数据结构与算法思想
- 双指针算法