在一个
排序
的链表中,存在
重复
的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。
思路:
首先要明白排序的链表,重复的结点一定是相连的!!!
①定义一个傀儡结点,newHead.next = head
②定义前后指针,prev last
③大前提是last不能为空的情况下循环找重复的值
④若last.val != last.next.val,前后指针一人一步走继续找
⑤若last.val == last.next.val,后指针继续往前走,因为有可能是多个重复
注意!!!
last.next 一定不能为空防止空指针异常
⑥删除重复结点(prev.next!= last)说明存在重复结点 prev.next = last.next
切记!!!
最后一定last要向后再走一步,为了顺利下面的寻找
⑦最后返回 newHead.next
代码实现:
/*
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){
return null;
}
//创建一个虚拟头结点
ListNode head = new ListNode(-1);
head.next = pHead;
//定义2个前后指针
ListNode prev = head;
ListNode last = prev.next;
while(last != null){
//确定重复结点的起始点
while( last.next != null && last.val!= last.next.val){//两个一起走
prev = prev.next;
last = last.next;
}
//走动这儿说明其中上面的某个条件不满足了
//确定重复区域
while(last.next != null && last.val == last.next.val){//last走
last = last.next;
}
if(prev.next != last){//删除结点
prev.next = last.next;
}
last = last.next;
}
return head.next;
}
}