题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点。
解析:
1.保留重复的结点
例:1->1->2
①比较当前结点的值与下一结点的值,如果相同,则当前结点指向下一结点的下一结点;
②如果当前结点的值与下一结点的值不同,则当前结点移动到下一结点。
③根据上述思路,由于当前结点的值1和下一结点的值1相同,则当前结点指向下一结点的下一节点,即1->2。
public ListNode deleteDuplicates(ListNode head) {
if (head ==null){
return null;
}
ListNode tmp = head;
while(head.next != null){
if (head.val == head.next.val){
head.next = head.next.next;
}else{
head = head.next;
}
}
return tmp;
}
2.去除重复的结点
①首先定义一个头结点连接链表,再定义两个指针p1和p2分别指向这个头结点和原先的头结点;
②如果p2指向的结点值等于下一节点的值,则继续移动p2到下一结点直到不满足前面的条件,再将p1指向的结点连接上p2指向的结点,这一步相当于去除重复的元素;
③如果p2指向的结点值不等于下一节点的值,则同时继续移动两个指针到下一结点。
public ListNode deleteDuplication2(ListNode pHead){
if (pHead == null) return null;
ListNode first = new ListNode(-1);
first.next = pHead;
//定义两个指针
ListNode ptr1 = first, ptr2 = pHead;
while (ptr2!=null&&ptr2.next!=null){
if (ptr2.val == ptr2.next.val){
//如果相邻两个结点值相等,则记录当前值val
int val = ptr2.val;
//继续移动结点到结点值不等于val的结点上
while(ptr2 != null&& val == ptr2.val){
ptr2 = ptr2.next;
}
//第一个指针指向的结点连接上非重复的结点,相当于去除重复结点
ptr1.next = ptr2;
}else{
//如果相邻两个结点的值不相等,则两个指针继续往下走
ptr1 = ptr2;
ptr2 = ptr2.next;
}
}
return first.next;
}