题目描述:
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
解题思路1:
- 首先创建一个头指针,同时有一个指针指向头结点,头结点向后判断是否有和它值一样的结点,一样的话找到相同值的结点的最后一个,然后用头指针指向该节点的下一个
若不相同,则头指针和指向头结点的指针各向后移一位
public ListNode deleteDuplication(ListNode pHead)
{
if(pHead==null||pHead.next==null)
return pHead;
ListNode head_ini = new ListNode(-1);
head_ini.next = pHead;
ListNode p1 = head_ini;
ListNode p2 = pHead;
while(p2.next!=null){
if(p2.next.val==p2.val){
ListNode p3 = p2.next;
while(p3.next!=null&&p3.next.val==p3.val)
p3 = p3.next;
p1.next = p3.next;
p2 = p3;
}
else{
p1 = p2;
}
if(p2.next!=null)
p2 = p2.next;
}
p2.next = null;
return head_ini.next;
}
解题思路2:
利用递归的思路,如果头结点就和后面的元素相同,则直接调用第一个不相同的结点做为头结点的删除重复节点的函数,否则递归调用该函数
public class Solution {
public ListNode deleteDuplication(ListNode pHead)
{
if(pHead==null||pHead.next==null)
return pHead;
ListNode next = pHead.next;
if(next.val==pHead.val){
while(next!=null&&next.val==pHead.val)
next = next.next;
return deleteDuplication(next);
}
else{
pHead.next = deleteDuplication(pHead.next);
return pHead;
}
}
}