在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表 1->2->3->3->4->4->5 处理后为 1->2->5
解法一:递归
public ListNode deleteDuplicates(ListNode head) {
// 退出条件
if (head == null || head.next == null){
return head;
}
//有重复就只移动头结点到重复后一个结点
if(head.val == head.next.val){
ListNode pre = head.next;
// 找出重复结点后的第一个重复结点
while(pre != null && pre.val == head.val){
pre = pre.next;
}
return deleteDuplicates(pre);
}
// 无重复就将头结点指向下一个结点
else{
head.next = deleteDuplicates(head.next);
return head;
}
}
解法二:非递归
public ListNode deleteDuplication(ListNode pHead) {
// 为空直接返回
if(pHead == null || pHead.next == null){
return pHead;
}
// 新建一个链表,头结点值为空,指向传入的结点
ListNode newHead = new ListNode(0);
newHead.next = pHead;
ListNode pre = newHead;
ListNode tail = newHead.next;
while(tail != null){
if (tail.next != null && tail.val == tail.next.val){
// 找到本次重复结点的最后一个结点
while (tail.next != null && tail.val == tail.next.val){
tail = tail.next;
}
// 用pre.next临时存储本次重复结点后的下一个结点,等待下次循环验证是否为符合要求的结点
// 如果下次验证不合格,则会更新next结点,直到验证符合的结点,就将pre指针指向这一步标记的结点
pre.next = tail.next;
tail = tail.next;
}
else{
// 上一次循环存储的零时结点满足条件,用pre标记存储起来
pre = pre.next;
// 尾指针继续指向下一个结点
tail = tail.next;
}
}
// 返回结果,因为第一个就是用next标记的,返回头结点的下一个结点
return newHead.next;
}