题目要求:
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
思路:
题意很好理解,处理这种问题,为了防止删除第一个节点之后链表断掉,所以肯定要加一个头节点Head,然后最后返回Head.next,这种题都是这个套路。
接下来就是怎么删除,很简单的想法就是从头到尾遍历,由于链表是有序的,所以发现当前节点的值和后面的相等就可以删除当前节点,为了操作方便,这里我们共设置三个节点来监控,pre、pHead、next分别表示前一个节点,当前节点和后一个节点,对于删除节点很简单就是pre.next = next;然后相应的挪动指针,继续遍历。题目不好处理的地方有两个:
(1)一个是像1->2->3->3->4->4->5中的第二个三,因为第二个3已经和后面节点的值不相同了,所以我们要设置一个tag;
(2)第二个是像1->1->2->2->2->2->2,这样的链表最后应该返回空,如果我们的while循环的条件只设置成while(next!=null),这样就会返回{2},所以也需要用tag位来监控一下。
代码:
public class Solution {
public ListNode deleteDuplication(ListNode pHead){
if(pHead == null || pHead.next == null){
return pHead;
}
ListNode Head = new ListNode(0);//为了防止删除第一个节点,设置头节点
Head.next = pHead;
ListNode pre = Head;//设置前一个节点pre
ListNode next = pHead.next;//设置后一个节点next
int count = 0;//标志位tag
while(next != null || count == 1){//防止上述第二种情况发生
if(next == null && count == 1){//第二种情况
pre.next = next;
break;
}
if(pHead.val == next.val || count == 1){//防止第一种情况发生
if(pHead.val == next.val){
count = 1;
}
else{
count = 0;
}
pre.next = pHead.next;
pHead = next;
next = next.next;
}
else{
pre = pre.next;
pHead = pHead.next;
next = next.next;
count = 0;
}
}
return Head.next;
}
}