56.删除链表中重复的结点
题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
题目解答
方法一:递归
/* 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; } } }
方法二:设置指针
/* 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; } }