AcWing打卡活动
《剑指Offer》打卡活动
周二第六题 删除链表中重复的节点
/**
* 定义一个虚拟头结点,值为-1,这样就可以保证头结点不会被删除
* 使用两个引用,分别用来校验是否值一样
* 该题会完全删除掉重复的节点
* 由样例可知,不会出现负数值
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode deleteDuplication(ListNode head) {
// 虚拟节点
ListNode dummy = new ListNode(-1);
dummy.next = head;
// 第一个引用
ListNode p = dummy;
while(p.next != null) {
// 第二个引用
ListNode q = p.next;
/*
由于需要完全删除掉重复的节点,所以需要从该节点的下一个节点开始判断
然后判断下下个节点,下下下个节点...
举个例子
1 2 3 3 4
p指向2, q指向3,p的下一个节点的val和q的val必相等,所以q会继续往下走,指向第二个3
*/
while(q != null && p.next.val == q.val) {
q = q.next;
}
// 如果下个下点和下N个节点没有重复的,则指向第一个引用指向下个节点
if(p.next.next == q) {
p = p.next;
} else { // 否则第一个引用从下N个节点开始
p.next = q;
}
}
// 返回的节点中不能包含虚拟节点
return dummy.next;
}
}