在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
public static ListNode deleteDuplication(ListNode pHead) {
/* ListNode first = new ListNode(-1);//设置一个trick
//所有这些节点变量都是指向同一个链表,都是在操作同一个链表
first.next = pHead; //first用于保存链表,因为pHead可能会被删除
ListNode p = pHead; //用于遍历链表
ListNode last = first; //last用于删除重复节点,所以它在p节点前面,
while (p != null && p.next != null) {
if (p.val == p.next.val) {
int val = p.val;
while (p!= null&&p.val == val)
p = p.next; //p移到了下一个不相等的节点
last.next = p;//这一步是删除p前面的相等节点
} else {
last = p; //因为p与后一个节点不相等,所以将last移到p处。
p = p.next;
}
}
return first.next;
*/
//利用递归
if(pHead==null)
return null;
//判断一个链表的头和下一个节点,不相等就让头结点的next指向下一个节点的链表的递归
//相等时就返回第一个不相等的节点的链表
if(pHead!=null&&pHead.next==null)
return pHead;
ListNode current;
if(pHead.val==pHead.next.val){
current=pHead.next;
while(current!=null&¤t.val==pHead.val)
current=current.next;
return deleteDuplication(current);
}else{
current=pHead.next;
pHead.next=deleteDuplication(current);
return pHead;
}
}
}