class Solution {
//只遍历了一次,时间复杂度O(n)
//没有使用额外的空间,空间复杂度O(1)
public ListNode deleteDuplicates(ListNode head) {
ListNode dummy = new ListNode(0,head);//虚拟头结点,指向真正的头结点
ListNode p = dummy;//辅助指针,等于虚拟头结点(其实是指向要判断节点的前一个节点)
while(p.next != null){//开始循环链表,只要p.next != null,就还有元素要判断
ListNode q = p.next;//辅助指针,指向要判断的节点
while(q.next != null && q.val == q.next.val){
q = q.next;//当循环结束的时候,q就移动到了最后一个重复节点
}
if(q == p.next){//1.q没有移动,没有重复节点
p = p.next;//只需要让p后移
}else{//2.说明有重复节点
p.next = q.next;//跳过中间节点的重复节点
}
}
return dummy.next;
}
}
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head == null || head.next == null)
return head;
ListNode temp = head;
while(temp.next != null){
if(temp.val == temp.next.val){
temp.next = temp.next.next;
}else{
temp = temp.next;
}
}
return head;
}
}