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;
    }
}

 

posted @ 2019-01-15 19:56  chan_ai_chao  阅读(121)  评论(0编辑  收藏  举报