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

package LinkedList;

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

    public ListNode deleteDuplication_2(ListNode pHead) {
        // 设置一个节点指向头结点
        ListNode first = new ListNode(-1);
        first.next = pHead;
        // last指针永远指向移动前的扫到的最后一个节点
        ListNode last = first;
        while (pHead != null && pHead.next != null) {
            if (pHead.val == pHead.next.val) {
                int val = pHead.val;
                while (pHead != null && pHead.val == val)
                    pHead = pHead.next;
                last.next = pHead;
            } else {
                last = pHead;
                pHead = pHead.next;
            }
        }
        return first.next;
    }

    public static ListNode deleteDuplication(ListNode pHead) {
        // 只有0个或1个结点,则返回
        if (pHead == null || pHead.next == null)
            return pHead;
        // 当前结点是重复结点
        if (pHead.val == pHead.next.val) {
            ListNode listNode = pHead.next;
            while (listNode != null && listNode.val == pHead.val) {
                // 跳过值与当前结点相同的全部结点,找到第一个与当前结点不同的结点
                listNode = listNode.next;
            }
            return deleteDuplication(listNode);// 从第一个与当前结点不同的结点开始递归
        } else {// 当前结点不是重复结点
            // 保留当前结点,从下一个结点开始递归
            pHead.next = deleteDuplication(pHead.next);
            return pHead;
        }
    }

    public static class ListNode {
        int val;
        ListNode next = null;

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


}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Jack-Cui

160. Intersection of Two Linked Lists(Linked List-Easy)

    Write a program to find the node at which the intersection of two singly lin...

25550
来自专栏菩提树下的杨过

委托示例(利用委托对不同类型的对象数组排序)

using System; using System.Collections.Generic; using System.Text; namespac...

23490
来自专栏猿人谷

在O(1)时间删除链表结点

题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点。 函数的声明如下: void DeleteNode(ListNode** pListHead, ...

20280
来自专栏用户画像

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

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

11130
来自专栏武培轩的专栏

剑指Offer-链表中环的入口结点

package LinkedList; import java.util.HashSet; /** * 链表中环的入口结点 * 一个链表中包含环,请找出...

35130
来自专栏尾尾部落

[剑指offer] 两个链表的第一个公共结点

如果两个链表存在公共结点,那么它们从公共结点开始一直到链表的结尾都是一样的,因此我们只需要从链表的结尾开始,往前搜索,找到最后一个相同的结点即可。但是题目给出的...

21620
来自专栏武培轩的专栏

剑指Offer-两个链表的第一个公共结点

package LinkedList; import java.util.HashMap; /** * 两个链表的第一个公共结点 * 输入两个链表,找出...

34750
来自专栏用户2442861的专栏

轻松搞定面试中的链表题目

版权所有,转载请注明出处,谢谢! http://blog.csdn.net/walkinginthewind/article/details/7393134...

10820
来自专栏郭耀华‘s Blog

剑指offer 第九天

35.数组中的逆序对 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对10...

27540
来自专栏calmound

Remove Duplicates from Sorted List

问题:将有序链表中的重复元素删除 分析:由于有序,所以p结点是否重复只需要和它的前一节点比较是否相等就可以了,我们可以定义一个helper新头结点链表     ...

26450

扫码关注云+社区

领取腾讯云代金券