剑指Offer(链表)-删除链表中重复的节点

  (删除链表中重复的节点)题目描述:



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



  解题思路:这里的重复的节点不保留是将只要重复了的节点都要删除掉,所以考虑利用哈希set的方法,先进行重复性的判断,将重复的元素加入到哈希set中去,然后将重复的元素删除。

  利用到了两个指针pre和cur,来表示前一个节点和当前节点。

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

    ListNode(int val) {
        this.val = val;
    }
}
*/
import java.util.*;
public class Solution {
    public ListNode deleteDuplication(ListNode pHead)
    {
        if(pHead == null){
            return null;
        }
        //先找出相同节点存入哈希set中
        HashSet<Integer> set = new HashSet<>();
        ListNode pre = pHead;
        ListNode cur = pHead.next;
        while(cur != null){
            if(cur.val == pre.val){
                set.add(cur.val);
            }
            pre = cur;
            cur = cur.next;
        }
        //再删除相同节点
        /**
        *删除头结点(若头结点是重复节点的话)
        */
        while(pHead!=null&&set.contains(pHead.val)){
            pHead = pHead.next;
        }
        if(pHead == null){
            return null;
        }
        /**
        *再删除中间节点
        */
        pre = pHead;
        cur = pHead.next;
        while(cur != null){
            if(set.contains(cur.val)){
                pre.next = cur.next;
                cur = cur.next;
            }else{
                pre = cur;
                cur = cur.next;
            }
        }
        return pHead;
    }
}

  (1)特别需要注意在删除头结点的时候,pHead = pHead.next;其实就是不停地在将头结点移向下一个节点,此时也需要进行头结点的空指针判断,若只是:

while(set.contains(pHead.val)){
      pHead = pHead.next;
}

  由于set集中如果存在头结点重复的情况,比如输入是这样的{1,1,1,1,1,1},就会报空指针异常:

  所以如果是这种输入的情况的时候,就应该用下面的这种方式,进行头结点的空判断,然后返回一个null值。

while(pHead!=null&&set.contains(pHead.val)){
      pHead = pHead.next;
}
if(pHead == null){
      return null;
}

  (2)还有就是删除当前重复的元素的时候,利用的是pre.next = cur.next;,立足于当前的cur元素,因为是当前cur元素在重复集set里面,需要删除。

原文地址:https://www.cnblogs.com/dashenaichicha/p/12530712.html

时间: 2024-12-10 21:48:28

剑指Offer(链表)-删除链表中重复的节点的相关文章

剑指Offer:删除链表的节点【18】

剑指Offer:删除链表的节点[18] 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 题目分析 如上图所示,我们的定义了三个指针,其中第二.三个指针用于找到重复元素的第一个位置和最后一个位置的下一个位置,然后第一个指针的下一个指向三个指针,这样就跳过了重复元素. 但是编码发现后,还有两种情况欠考虑. 这种情况,刚开始,就是

[剑指offer] 56. 删除链表中重复的结点

题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 思路: class Solution { public: ListNode *deleteDuplication(ListNode *pHead) { if (pHead == NULL || pHead->next == NULL) return pHead; List

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

题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 # Definition for singly-linked list. class ListNode: def __init__(self, x): self.val = x self.next = None class Solution: def deleteDuplicat

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

题目描述: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 思路分析: 要考虑两种情况,链表中结点为0或1,此时直接返回原链表:第二种情况就是链表中包含两个及以上的结点. 解决第一种情况直接进行一个判断即可,第二种情况,需要定义三个指针pre, cur, nex来解决.其中为了最终返回链表头指针,需要额外定义一个指针,指向链表头.这里

【剑指Offer】删除链表中重复的节点

题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 A:当遍历到第一个值为重复的节点时,要有一个指针指向它的前一个节点    因为函数原型没有传二级指针进来,且头结点也有可能被删除,所以要构建一个新结点Head 用布尔型的flag_repeat判断是否有重复节点,若有重复节点则删除,若没有重复节点则移动指针 /* struct Li

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

题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 题解: 这道题没什么讲的,注意指向空的边界就行,新建一个头节点更容易处理. 1 class Solution { 2 public: 3 ListNode* deleteDuplication(ListNode* pHead) { 4 if (pHead == nullptr

剑指offer:删除链表的节点

# -*- coding: utf-8 -*- # @Time : 2019-04-19 21:21 # @Author : Jayce Wong # @ProjectName : job # @FileName : deleteNode.py # @Blog : https://blog.51cto.com/jayce1111 # @Github : https://github.com/SysuJayce # Definition for singly-linked list. class

剑指offer之【数组中重复的数字】

题目: 数组中重复的数字 链接: https://www.nowcoder.com/practice/623a5ac0ea5b4e5f95552655361ae0a8?tpId=13&tqId=11203&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述: 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不

【剑指Offer】03. 数组中重复的数字

题目链接 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重复的数字. 示例 1: 输入: [2, 3, 1, 0, 2, 5, 3] 输出:2 或 3 限制: 2 <= n <= 100000 解法一:最简单的,排序后找重复的 class Solution { public int findRepeatNumber(int[] nums) {

剑指offer系列24---数组中重复的数字

* [24] * [题目]在一个长度为n的数组里的所有数字都在0到n-1的范围内. * 数组中某些数字是重复的,但不知道有几个数字是重复的. * 也不知道每个数字重复几次. * 请找出数组中任意一个重复的数字. * 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3. 书上方法: 1 package com.exe6.offer; 2 /** 3 * [24] 4 * [题目]在一个长度为n的数组里的所有数字都在0到n-1的范围内. 5 * 数组中某些