存在一个按升序排列的链表,给你这个链表的头节点 head ,
请你删除链表中所有存在数字重复情况的节点,只保留原始链表中没有重复出现的数字。
输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]
输入:head = [1,1,1,2,3]
输出:[2,3]
双指针法:
1)指针cur:从头到尾遍历,找到相邻值相同的node
2)指针pre:在cur前面用来进行删除
解析:
需要虚拟头结点,因为头结点和第二个结点如果相同则都需要删除,
当两个结点都被删除,则真正的头结点变为dummy.next(升序排列,必然两个相等的数字相邻)
cur也应该遍历到最后一个结点,判断最后一个结点是否重复
没有重复下的遍历:
0 → 1 → 2 → 3 → 4 → 5
(虚拟头结点)
(指针pre) (指针cur) pre和cur中间相隔两个node, pre.next.next==cur;
有重复下的遍历:
0 → 1 → 1 → 1 → 2 → 3 → 4 → 5
(指针pre) (指针cur)
cur需要连续移动多次跨过相同值的node。
所以,判断是否有重复的if-else条件: pre.next.next==cur;
**
* 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 dummy=new ListNode(0);
dummy.next=head;
ListNode cur=head;
ListNode pre=dummy;
while(cur!=null){
while(cur.next!=null&&cur.val==cur.next.val){
cur=cur.next;
}
cur=cur.next;
if(pre.next.next==cur){
pre=pre.next;
}else{
pre.next=cur;
}
}
return dummy.next;
}
}