剑指Offer-57:删除链表中重复的节点

题目描述

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

解题思路

首先,链表中如果没有节点或者只有1个节点,直接返回pHead

接下来,判断头结点是不是和它后边一个节点重复

  • 如果重复的话,就一直往后找重复的节点,直到找到第一个不和pHead重复的节点,递归该节点
  • 如果不重复的话,pHead仍然保留,递归pHead.next,并且要记得递归返回的节点和pHead.next关联上,最后返回pHead

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/*
public class ListNode {
int val;
ListNode next = null;

ListNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ListNode deleteDuplication(ListNode pHead)
{
if( pHead == null || pHead.next == null )
return pHead;
if( pHead.val == pHead.next.val ){//当前节点和后一节点重复
ListNode now = pHead.next;
while( now != null && now.val == pHead.val ){//找到第一个不重复的
now = now.next;
}
return deleteDuplication( now );
}
else{//当前节点和后一节点不重复
pHead.next = deleteDuplication( pHead.next );
return pHead;
}

}
}