剑指offer第56题“删除链表中重复的结点”

继续剑指Offer Go Go Go

Posted by Cfeng on April 5, 2019

删除链表中重复的结点

题目描述

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

思路

一开始题目没搞懂。。。以为会有1->2->1的情况,然后输出2,做了我好久。。 把题目看懂后就很简单了,设三个指针,一个指向已判断过确认不重复的结点head,一个指向将要判断的结点left,一个指向left右边的结点,用来判断left是否重复,并找到下一个要判断的结点。 head先初始化为链表头。然后判断left与right,如果不想等,将head结点移动到left,如果想等,right一路找到下一个结点 ,并时head连接right。这里还要多一个操作,就是判断头结点是否重复。如果重复要移动头结点,并且要考虑头结点可能多次重复即11223344的情况(wa了三次。。。)。 之后就是移动left结点。完事

Java实现

/*
 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){
            return pHead;
        }
        ListNode left = pHead;
        ListNode head = new ListNode(0);
        head.next = left;
        ListNode right = left.next;
        while(left != null && left.next != null) {
            right = left.next;
            if(left.val != right.val) {
                head = left;
            }
            else { 
                while(right != null && left.val == right.val) {
                    right = right.next;
                }
                if(head.next == pHead) {
                    pHead = right;
                }
                head.next = right; 
            }
            left = right;
        }
        return pHead;
    }
}