题目:
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
思路:
定义3个指针,前一个pre,当前cur, 后一个lat,如果cur和lat相同,cur和lat都向后走,直到lat不等于cur,将pre的next指针指向lat, cur = lat; lat = lat.next;
两个特殊情况:第一个结点重复和最后一个结点重复:
如果第一个结点重复的话,保存一下头节点的值,如果后面的值等于头结点就一直向后走,直到不等于头节点的值
如果最后一个结点重复的话,让前一个结点pre指向null
代码:
public class Solution {
public ListNode deleteDuplication(ListNode pHead){
if(pHead == null){
return null;
}
ListNode head = pHead;
//第一个结点重复的情况
while(head.next != null && head.val == head.next.val){
ListNode head_temp = head.next;
int num_temp = head.val;//保存第一个结点的值
while(head_temp != null && head_temp.val == num_temp){
head_temp = head_temp.next;
}
head = head_temp;
if(head == null){
return null;
}
}
if(head == null){
return null;
}
if(head.next == null){
return head;
}
ListNode pre = head;
ListNode cur = pre.next;
ListNode lat = cur.next;
while(lat != null){
if(cur.val == lat.val){
while(lat != null && cur.val == lat.val){
cur = cur.next;
lat = lat.next;
}
if(lat == null){//lat是null,最后一个结点的情况
pre.next = null;
return head;
}
pre.next = lat;
cur = lat;
lat = lat.next;
}else{
pre = pre.next;
cur = cur.next;
lat = lat.next;
}
}
return head;
}
}