剑指offer-删除链表中重复的结点

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
链接:https://www.nowcoder.com/questionTerminal/fc533c45b73a41b0b44ccba763f866ef
来源:牛客网

if (pHead==null || pHead.next==null){return pHead;}
ListNode Head = new ListNode(0);
Head.next = pHead;
ListNode pre  = Head;
ListNode last = Head.next;
while (last!=null){
    if(last.next!=null && last.val == last.next.val){
        // 找到最后的一个相同节点
        while (last.next!=null && last.val == last.next.val){
            last = last.next;
        }
        pre.next = last.next;
        last = last.next;
    }else{
        pre = pre.next;
        last = last.next;
    }
}
return Head.next;

 

链接:https://www.nowcoder.com/questionTerminal/fc533c45b73a41b0b44ccba763f866ef
来源:牛客网

public static ListNode deleteDuplication(ListNode pHead) {
         
        ListNode first = new ListNode(-1);//设置一个trick
 
        first.next = pHead;
 
        ListNode p = pHead;
        ListNode last = first;
        while (p != null && p.next != null) {
            if (p.val == p.next.val) {
                int val = p.val;
                while (p!= null&&p.val == val)
                    p = p.next;
                last.next = p;
            } else {
                last = p;
                p = p.next;
            }
        }
        return first.next;
    }

 

链接:https://www.nowcoder.com/questionTerminal/fc533c45b73a41b0b44ccba763f866ef
来源:牛客网

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

/*
作者:牛客396545268号
链接:https://www.nowcoder.com/questionTerminal/fc533c45b73a41b0b44ccba763f866ef
来源:牛客网

pHead.next = deleteDuplication(pHead.next); 实参pHead.next表示将当前节点与下一节点不同,
所以要将下一节点放入递归程序去参加下一轮的比较,这样就将pHead保留了下来。
返回值给pHead.next表示deleteDuplication返回了一个无重复的节点,所以要让当前节点指向它。
*/

 

posted @ 2019-02-13 16:09  Roni_i  阅读(318)  评论(0编辑  收藏  举报