31.删除链表中重复元素

题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点。

解析:
1.保留重复的结点
例:1->1->2
①比较当前结点的值与下一结点的值,如果相同,则当前结点指向下一结点的下一结点;
②如果当前结点的值与下一结点的值不同,则当前结点移动到下一结点。
③根据上述思路,由于当前结点的值1和下一结点的值1相同,则当前结点指向下一结点的下一节点,即1->2。

public ListNode deleteDuplicates(ListNode head) {
        if (head ==null){
            return null;
        }
        ListNode tmp = head;
        while(head.next != null){
           if (head.val == head.next.val){
               head.next = head.next.next;
           }else{
               head = head.next;
           }
        }
       return tmp;
    }

2.去除重复的结点
①首先定义一个头结点连接链表,再定义两个指针p1和p2分别指向这个头结点和原先的头结点;
②如果p2指向的结点值等于下一节点的值,则继续移动p2到下一结点直到不满足前面的条件,再将p1指向的结点连接上p2指向的结点,这一步相当于去除重复的元素;
③如果p2指向的结点值不等于下一节点的值,则同时继续移动两个指针到下一结点。

 public ListNode deleteDuplication2(ListNode pHead){
   if (pHead == null) return null;
   ListNode first = new ListNode(-1);
   first.next = pHead;
   //定义两个指针
   ListNode ptr1 = first, ptr2 = pHead;
   while (ptr2!=null&&ptr2.next!=null){
    if (ptr2.val == ptr2.next.val){
      //如果相邻两个结点值相等,则记录当前值val
     int val = ptr2.val;
      //继续移动结点到结点值不等于val的结点上
     while(ptr2 != null&& val == ptr2.val){
      ptr2 = ptr2.next;
     }
      //第一个指针指向的结点连接上非重复的结点,相当于去除重复结点
     ptr1.next = ptr2;
    }else{
      //如果相邻两个结点的值不相等,则两个指针继续往下走
     ptr1 = ptr2;
     ptr2 = ptr2.next;
    }
   }
   return first.next;
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值