力扣简83 删除排序链表中的重复元素

//注意这个ListNode类需要写在solution外面,要不然main里没法使用。而且main中类的新建要用。题解说要详细询问考官删除的节点是否需要释放空间!

//自己写的: 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
//第一种思路的时候出错了 直接用l.next和l.next.next导致都混乱了 以后链表还是建议要用pre
//换了写法后,最初没有第一个空判断,导致对于空情况取next报错了

 //题解中有一个看起来更优越的方法:设l,r,令r移动至与l值不同的位置再更改指针指向,减少了更改次数。

public ListNode deleteDuplicates(ListNode head) {

  if(head==null) {

    return head;
  }
  else {
    ListNode l = head.next;
    ListNode pre = head;
    while(l!=null) {
      if(pre.val==l.val) {
        pre.next=l.next;
        l=l.next;
      }  
      else {
        pre=l;
        l=l.next;
      }
    }
    return head;
  }
}

 

//题解:

public ListNode deleteDuplicates(ListNode head) {
  if(head==null) {
    return head;
  }
  else {
    ListNode l=head;
    ListNode r=head;
    while(r.next!=null) {
      r=r.next;
      if(l.val==r.val) {
        continue;
       }
      else {
        l.next=r;//最初竟然忘了改这个指针
        l=r;
      }
    }
    l.next=null; //对于最终末尾有相同元素的,最后r指针遍历到null而停止,此时应该l.next置null
  }
  return head;
}

posted @ 2022-05-16 14:54  Ssshiny  阅读(25)  评论(2)    收藏  举报