题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
代码:
public class Solution {
public ListNode deleteDuplication(ListNode pHead){
if(pHead == null || pHead.next == null) //循环终止条件
return pHead;
if(pHead.val == pHead.next.val){ //第一个节点就是重复,如222223或22222
ListNode cur = pHead;
while(cur != null && cur.val == pHead.val) //重复节点后移,如22223一直移动到3停下
cur = cur.next;
return deleteDuplication(cur);
}else{ //第一个节点不是重复的情况,如12222
pHead.next = deleteDuplication(pHead.next);
return pHead;
}
}
}
思路:递归,不用递归比较麻烦,我写了很久都没写出来。。。
将情况分成两大类,没大类又分成两小类:
第一类:第一个节点就是重复节点
1)22223.XXXX :注XXX无论是什么都不重要,都可以使用递归解决(当然是从3开始递归,因为3和后面的X可能一样,如果一样3也要删除,多以递归从3开始)。
2)2222null:也是使用递归(从null位置开始递归)。
两者共同点,都是从最后一个重复元素下一个元素开始递归。所以代码可以统一。
第二类:第一个节点不是重复节点,也就是说第一个节点和第二个节点不一样,这样只要递归第二个节点以后的节点(包含第二个节点)。
1)1222223XXX
2)122222null