删除有序链表中的重复结点
编写代码:在一个排序的链表中,存在重复的结点,请删除链表中重复的结点,重复的结点不保留,返回链表头指针。
例如: 链表 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```