剑指offer-56 删除链表中重复的结点 -- Java实现

题目

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

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

    ListNode(int val) {
        this.val = val;
    }
}
*/

分析

思路一:

要删除重复的结点,可以遍历当前结点的下一结点和下下一个结点,如果发现值相同,就将当前结点指向之后不重复的结点,如此接着继续判断,直到没有重复的结点。此处需要注意如果是头结点重复的情况,所以我们需建一个新结点,将其指向pHead。具体思路见代码。

时间复杂度:o(N)
空间复杂度:o(1)

代码:

public class Solution {
    public ListNode deleteDuplication(ListNode pHead)
    {
        //首先判断异常输入(输入为空指针)情况
        if(pHead==null) return null;
        
        //新建一个头指针,其指向pHead,防止头结点重复的情况
        ListNode first = new ListNode(-1);
        first.next = pHead;
        ListNode cur = first;
        //遍历链表
        while(cur.next!=null && cur.next.next!=null){
            if(cur.next.val==cur.next.next.val){
                while(cur.next.next!=null && cur.next.val==cur.next.next.val){
                    cur.next = cur.next.next;  //删除中间多余的重复结点
                }
                cur.next = cur.next.next; //删除最后一个多余的重复结点
            } else{
                cur = cur.next;
            }
        }
        
        return first.next;
    }
}
发布了46 篇原创文章 · 获赞 17 · 访问量 1037

猜你喜欢

转载自blog.csdn.net/weixin_42054926/article/details/103185923