删除排序链表中的重复元素

 82.. - 力扣(LeetCode)

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;
    }
}

 83.. - 力扣(LeetCode)

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;
    }
}

你可能感兴趣的:(链表,算法,数据结构)