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

给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。

示例 1:

输入: 1->1->2
输出: 1->2
示例 2:

输入: 1->1->2->3->3
输出: 1->2->3

解答:

  首先此链表是排序的链表,不会出现相同的元素中间有其它的元素。

  解法1:

  

public static ListNode deleteDuplicates(ListNode head) {
    /*定义一个哑节点*/
    ListNode dumb=new ListNode(0);
    /*哑节点的下一个节点指向头节点*/
    dumb.next=head;
    /*快指针*/
    ListNode fast=head;
    /*慢指针*/
    ListNode slow=dumb;
    /*当快指针不为null时继续*/
    while (fast!=null){
      /*如果fast到了尾节点或fast的数字与fast的next的数字不一样时进入*/
      if(fast.next==null||fast.val!=fast.next.val){
        /*如果相邻,则slow引用指向fast所指的对象*/
        if(slow.next==fast){
          slow=fast;
        }else{
          /*如果不相邻,则说明中间存在重复元素,将slow的下一个指向fast,这样就抹去了相同的元素其中的一个*/
          slow.next=fast;
          /*同时slow移向自己的下一个*/
          slow=slow.next;
        }
      }
      fast=fast.next;
    }
    return dumb.next;
  }
View Code

 解法2:

public static ListNode deleteDuplicates1(ListNode head){
    /*定义一个引用指向头*/
    ListNode curr=head;
    /*当当前不为空和下一个不为空时*/
    while (curr!=null&&curr.next!=null){
      /*如果当前的值和下一个的值一样则当前节点的下一个节点指向下下一个节点,否则当前节点向后移动一位*/
      if(curr.next.val==curr.val){
        curr.next=curr.next.next;
      }else {
        curr=curr.next;
      }
    }
    return head;
  }
View Code