方法一:递归this
/* 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){ // 只有0个或1个结点,则返回 return pHead; } if(pHead.val==pHead.next.val){ // 当前结点是重复结点 ListNode pNode=pHead.next; while(pNode!=null && pNode.val==pHead.val){ // 跳过值与当前结点相同的所有结点,找到第一个与当前结点不一样的结点 pNode=pNode.next; } return deleteDuplication(pNode); // 从第一个与当前结点不一样的结点开始递归 }else{ pHead.next=deleteDuplication(pHead.next); // 保留当前结点,从下一个结点开始递归 return pHead; } } }
方法二:设置指针spa
/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } */ public class Solution { public ListNode deleteDuplication(ListNode pHead){ ListNode pPreHead=new ListNode(-1); //设立虚拟头结点,由于头结点可能会被删掉 pPreHead.next=pHead; ListNode pre=pPreHead; ListNode cur=pHead; while(cur!=null && cur.next!=null){ if(cur.val==cur.next.val){ int val=cur.val; while(cur!=null && cur.val==val){//与当前结点相同的结点都跳过,重复的节点全不保留 cur=cur.next; } pre.next=cur; }else{ pre=cur; cur=cur.next; } } return pPreHead.next; } }