链表面试题--删除有序链表中的重复结点(java)

删除有序链表中的重复结点
编写代码:在一个排序的链表中,存在重复的结点,请删除链表中重复的结点,重复的结点不保留,返回链表头指针。
例如: 链表 1 --> 2 --> 3 --> 3 --> 4 --> 4 --> 5
       处理后:1 --> 2 --> 5
思路: 两个引用(挨着的)遍历整个链表
       1.如果值不等
         根据有序性,两个引用都往后走
       2. 如果值相等
         让后边的引用前进,直到遇到不相等的结点或 null,删除[ p1, p2) 所有结点
        然后 p1=p2 ;p2=p2.next;(注意p2== null 怎么办) 循环这个过程,直到p2==null
        3. 删除结点,需要前驱结点
          如果最开始两个结点就相等,没有前序怎么办
          添加个假的结点

方1: 添加假前驱结点 ListNode prev= new ListNode(0) 值随意

public ListNode deleteDuplication(ListNode pHead){
  if(pHead==null){
   return null;
  }
  ListNode prev=new ListNode(0);
  prev.next=pHead;
  //prev 会变化,提前记录
  ListNode fake=prev;
  ListNode p1=pHead;
  ListNode p2=pHead.next;
  
  while(p2!=null){
   if(p1.val!=p2.val){
    prev=p1;
    p1=p2;
    p2=p2.next;
   }else{
    while(p2!=null&&p2.val==p1.val){
     p2=p2.next;
    }
    prev.next=p2;
    p1=p2;
    if(p2!=null){
     p2=p2.next;
    }
   }
  }
  return fake.next;
 }

方2: 没添加假结点,设 prev=null;

public ListNode deleteDuplication1(ListNode pHead){
  if(pHead==null){
   return null;
  }
  ListNode prev=null;
  ListNode p1=pHead;
  ListNode p2=pHead.next;
  while(p2!=null){
   if(p1.val!=p2.val){
    prev=p1;
    p1=p2;
    p2=p2.next;
   }else{
    while(p2!=null&&p2.val==p1.val){
     p2=p2.next;
    }
    if(prev==null){
     pHead=p2;
    }else{
     prev.next=p2;
    }
    p1=p2;
    if(p2!=null){
     p2=p2.next;
    }
   }
  }
  return pHead;
 }

结果如下

测试删除有序链表重复结点
(1)-->(2)-->(5)-->null```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值