题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
思路
- 定义两个指针,一个pre指向确定不重复的节点,另一个last作为工作节点向前遍历找重复节点
- 若发现存在重复元素:last每次遍历找出一组重复元素,此时last指向这组重复元素的最后一个元素,pre指向开始重复的元素的前一个。所以把pre和last的下一个节点连接上就完成第一趟
- 接下来把last向后移动,再找下一组重复元素…重复第二步
- 若发现不存在重复元素:pre和last就继续向前找
注意点:可能第一个元素就是重复的,需要删除——先创建一个头结点,放在链表头结点前面
实现
/*
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;
ListNode head=new ListNode(0);
head.next=pHead;
ListNode pre=head;
ListNode last=pHead;
//最终pre指向开始重复的元素的前一个元素,last指向所有重复元素的结尾
while(last!=null){
//存在重复元素
if(last.next!=null && last.val==last.next.val){
//while循环找出一组重复元素(重复元素可能不止2个,所有用while)
while(last.next!=null && last.val==last.next.val){
last=last.next;
}
//把上面找到的一组重复元素删掉
pre.next=last.next;
//再接着找下一组重复元素
last=last.next;
}
//没找到重复元素,就一直向前找
else{
pre=pre.next;
last=last.next;
}
}
return head.next; //不能返回pHead,因为pHead可能也是重复元素,被删除了
}
}