剑指Offer对答如流系列 - 删除链表中重复的结点

面试题18:删除链表中重复的结点

一、题目描述

在一个排序的链表中,如何删除重复的节点?

链表结构定义如下

  public class Node{
        int val;
        Node next;
        public Node(int value,Node next) {
            val=value;
            next=next;
        }
    }

二、问题分析

在上一篇文章剑指Offer对答如流系列 - 在O(1)时间删除链表结点已经论述过链表节点的删除。这里不再多说。

这道题略有不同的是 链表的节点的值是符合排序的,我们很容易检测数值相同的节点,考虑到这种节点有多个(连续重复的情况),我们这里要稍作处理。其他操作都是非常常规的。

三、问题解答

具体解答如下:

 public Node deleteDuplication(Node pHead){
        Node pre = null;
        Node cur = pHead;
        while(cur!=null){
            // cur指的是当前节点,当当前节点的下一个节点不为null 且与当前节点的值相同的时候 进行循环(解决连续重复的问题)
            if(cur.next!=null && cur.next.val==cur.val){
                while(cur.next!=null && cur.next.val==cur.val) {
                    cur=cur.next;
                }
                cur=cur.next;
                if(pre == null) {
                    pHead=cur;
                }
                else {
                    pre.next=cur;
                }
            }else{
                pre=cur;
                cur=cur.next;
            }
        }
        return pHead;
    }
发布了136 篇原创文章 · 获赞 3155 · 访问量 44万+

猜你喜欢

转载自blog.csdn.net/qq_42322103/article/details/104075364