题目描述

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

 

题目链接:

https://www.nowcoder.com/practice/fc533c45b73a41b0b44ccba763f866ef?tpId=13&&tqId=11209&rp=1&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking

 

 

分析:

三个指针。分别指向,新链表尾部,判断节点(这个节点直到指向下一个不重复的节点),遍历节点。

 

/*
 public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    public ListNode deleteDuplication(ListNode pHead)
    {
        //head记录新的头结点
        ListNode head = null;
        //记录新链表的尾节点
        ListNode pre = null;
        //判断节点,比如:指向pre节点的下一个节点。
        ListNode pos = null;
        //遍历节点,直到找到与pos节点不同的节点
        ListNode cur = pHead;
        
        while(cur != null){
            //初次进来
            if(pos == null){
                pos = cur;
            }
            //相等的话遍历节点直接跳到下一个
            if(pos.val == cur .val){
                cur = cur.next;
                continue;
            }
            //到这一定满足pos.val != cur.val。同时说明pos节点不重复
            if(pos.next == cur){
                //记录下新链表的头部
                if(head == null){
                    head = pos;
                }
                //更新新链表的尾部
                if(pre == null){
                    pre = pos;
                }else{
                    pre.next = pos;
                    pre = pos;
                }
            }
            //pos 指向遍历节点,遍历节点继续往下走
            pos = cur;
            cur = cur.next;
        }
        //处理尾部节点,旧链表尾部节点也是一个不重复的节点
        if(pos != null && pos.next == null){
            if(pre == null){
                head = pos;
            }else{
                pre.next = pos;
            }
        }else{
            //当链表全部重复或者链表为空链表时,更新新链表的尾部
            if(pre == null){
                head = null;
            }else{
                pre.next = null;
            }
        }
        return head;
    }
}

 

方法二:

建一个头部节点,来解决一个从头部节点重复的情况。

大体流程:当遇到当前节点的值与下一个节点的值相等时,直到找到下一个节点不同的值或者null,将新链表尾节点指向这个不同的节点或null。

当不相等时,新链表尾节点移动到下一个节点。

 

 

/*
 public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    public ListNode deleteDuplication(ListNode pHead)
    {
        ListNode head = new ListNode(0);
        head.next = pHead;
        ListNode pre = head;;
        ListNode cur = pHead;
        while(cur != null){
            //下一个节点非null,且下一个节点与当前节点值相等
            if(cur.next != null && cur.val == cur.next.val){
                //直到找到下一个节点与当前节点与下一个节点不相等
                while(cur.next != null && cur.val == cur.next.val){
                    cur = cur.next;
                }
                //指向下一个节点
                cur = cur.next;
                //pre的next设置为下一个节点(下一个节点可能为null,处理尾部情况)
                pre.next = cur;
            }else{
                //当前节点的值与下一个节点的值不相等,pre向下移动一个
                pre = pre.next;
                cur = cur.next;
            }
        }
        return head.next;
    }
}

 

posted on 2020-06-13 15:02  MoonBeautiful  阅读(167)  评论(0编辑  收藏  举报