题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5。
思路:使用一个虚拟头节点(head)指向原来的头节点,p1 = head,p2 = head.next;根据p2.val == p2.next.val判断节点是否重复,重复的话直接将p2向下移动,p2 = p2.next,跳过重复节点,最后让p1.next=p2,就将重复节点跳过了。不重复,直接让p1,p2以相同的速度向下移动。
public class Solution {
public ListNode deleteDuplication(ListNode pHead)
{
//空节点或者只有一个节点
if(pHead==null||pHead.next==null){
return pHead;
}
// 虚拟头节点
ListNode myNode = new ListNode(-1);
myNode.next = pHead;
ListNode p1 = myNode;
ListNode p2 = myNode.next;
// p2!=null,
while(p2!=null){
// 存在重复元素
if(p2.next!=null&&p2.val == p2.next.val){
//p2不断向下移动
while(p2.next!=null&&p2.val == p2.next.val){
p2 = p2.next;
}
// 跳过重复元素中最后一个存在的元素
p1.next = p2.next;
p2 = p2.next;
}else{
// 节点不重复
p1=p1.next;
p2=p2.next;
}
}
return myNode.next;
}
}