题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
算法解析:
我们从头到尾遍历整个链表,如果当前结点值和下一结点值相同,就都可以删除,但我们需要将之前的结点保存下来,用于保证链表不会在删除的过程中断开,当然需要注意的是,如果需要删除的结点包括头结点,那么我们需要实时更新头结点。
代码如下:
public ListNode deleteDuplication(ListNode pHead)
{
if (pHead == null){
return null;
}
ListNode temp = pHead;
ListNode preNode = null;
while (temp != null){
ListNode pNext = temp.next;
boolean needDelete = false;
if (pNext != null && pNext.val == temp.val){
needDelete = true;
}
if (!needDelete){
preNode = temp;
temp = temp.next;
}else{
int value = temp.val;
ListNode pToBeDel = temp;
while (pToBeDel != null && pToBeDel.val == value){
pNext = pToBeDel.next;
pToBeDel = pNext;
}
if (preNode == null){
pHead = pNext;
}else {
preNode.next = pNext;
}
temp = pNext;
}
}
return pHead;
}