1.由于链表是排序好的,所以就减少了一些麻烦
首先我们需要定义一个傀儡节点(head),来减少边界判断,把后续的答案往后的答案接在傀儡节点之后;
让傀儡节点连接,整个链表
同时,定义一个cur 指向 傀儡节点的下一个节点
定义一个pre指向当前傀儡节点
此时需要判断当前cur节点是否和他的下一个节点重复,如果不重复,pre指向cur,cur指向cur.next;
注意:判断cur下一个节点的值时,需要先判断cur.next是否为空,不然会导致空指针~~
此时cur的值和cur.next的值相同,cur只需要往后走一步,然后继续判断,是否相同
当不相同的时候,跳出循环,此时cur还在重复节点位置,所以需要让他再走一步,即cur = cur.next
然后修改pre的指向,是他指向最新的cur
直到cur为空时,遍历完链表,循环结束
最后返回傀儡节点的下一个节点,return head.next;
public class Solution {
public ListNode deleteDuplication(ListNode pHead) {
if(pHead == null ) return null;
ListNode head = new ListNode(-1);
head.next = pHead;
ListNode cur = head.next;
ListNode pre = head;
while(cur != null){
if(cur.next != null && cur.next.val == cur.val){
while(cur.next != null && cur.next.val == cur.val){
cur = cur.next;
}
cur = cur.next;
pre.next = cur;
}else{
pre = cur;
cur = cur.next;
}
}
return head.next;
}
}
大家 也可以用Set来做~~