[编程题] 删除链表中的重复节点 (保留重复节点一次)

[编程题] 删除链表中的重复节点 (保留重复节点一次)

题目信息

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

方法

三指针

Java代码

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

    ListNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
     //方法1:直接删除
    
    public ListNode deleteDuplicates(ListNode head) {
        ListNode dummy = head;
        while(dummy!=null && dummy.next!=null){
            if(dummy.val==dummy.next.val){
                dummy.next = dummy.next.next;
            }else{
                dummy = dummy.next;
            }
        }
        return head;
    }

    //方法2:三指针
    public ListNode deleteDuplication(ListNode pHead){
        ListNode p0 = pHead;
        ListNode p1 = p0.next;
        ListNode p2 = p1.next;
        
        while(p1!=null){
            //如果没重复的话就指针后移
            if(p0.val!=p1.val){
                p0 = p0.next;
                p1 = p0.next;
                p2 = p1.next;
            }else{
                p0.next = p2;  //跨过重复的p1;
                
                //指针重新定位
                p0 = p2;
                p1 = p0.next;
                if(p1!=null){
                    p2 = p1.next;
                }
            }
        }
        //返回
        return pHead;
        
    }
}

输出:

image-20200802160032399

posted @ 2020-08-02 16:02  北鼻coder  阅读(426)  评论(0编辑  收藏  举报