在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,返回链表头指针。
例如,链表1->2->3->3->4->4->5 处-理后为 1->2->3->4->5
public ListNode deleteDuplication(ListNode pHead)
{
if (pHead==null){
return pHead;
}
ListNode pre=pHead;
ListNode curr=pHead.next;
while (curr!=null){
if (curr.val==pre.val){//如果当前结点的值和前一结点重复
pre.next=curr.next;
curr=pre.next;
}else {
pre=curr;
curr=curr.next;
}
}
return pHead;
}
例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
主要用了一个指针preNotParall 每次指向上一个不重复的数据 headpre是第一个不重复的数据(自己定义的,防止上来就是重复数据),也是头的上一个指针. pre和curr是工作指针,用来往后撸链表,留有用的.
public ListNode deleteDuplication2(ListNode pHead) //重复元素一个都不保留
{
if (pHead == null) {
return pHead;
}
ListNode headpre=new ListNode(0);//设headpre
headpre.next=pHead;
//{0,1,2,3,3,4,4,5}
ListNode preNotParall = headpre;//记录上一个不重复的结点
ListNode pre = pHead;
ListNode curr = pHead.next;
while (curr != null) {
if (curr.val == pre.val) {//如果当前结点的值和前一结点重复
//继续往下找,直到当前结点和前一结点值不同
while (curr!=null&&curr.val == pre.val){
curr=curr.next;
}
preNotParall.next=curr;
if (curr!=null){
pre=curr;
curr=pre.next;
}else {
return headpre.next;
}
} else {
preNotParall.next=pre;
preNotParall=pre;
pre = curr;
curr = curr.next;
}
}
return headpre.next;
}