首页 > 其他分享 >力扣-82. 删除排序链表中的重复元素

力扣-82. 删除排序链表中的重复元素

时间:2024-05-01 21:45:36浏览次数:26  
标签:力扣 cur nullptr next 链表 82 prev 节点

1.题目

题目地址(82. 删除排序链表中的重复元素 II - 力扣(LeetCode))

https://leetcode.cn/problems/remove-duplicates-from-sorted-list-ii/

题目描述

给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。

 

示例 1:

输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]

示例 2:

输入:head = [1,1,1,2,3]
输出:[2,3]

 

提示:

  • 链表中节点数目在范围 [0, 300]
  • -100 <= Node.val <= 100
  • 题目数据保证链表已经按升序 排列

2.题解

2.1 一次遍历

思路

1.首先注意是否需要处理空链表情况? 这里 *cur = head, cur != nullptr 即可以避免空链表的情况
2.是否需要虚拟头结点?是,因为可能出现需要删除链表头部元素的可能
3.需要几个节点?首先要一个prev保存上一个非重复元素位置; 其次我们需要一个cur用来表示当前位置, 可能还需要一个临时节点tempy用于更新链表(便于删除)
4.对于出现重复值和没有出现重复值的处理是不一样的,我们需要进行不同的处理:
4.1对于没有出现重复值的话,我们直接将prev和cur都往后移动即可
4.2对于出现重复值的情况,我们保持prev不动,向后移动cur(同时删除当前cur节点)直到:

  • 1.cur的值和下一个值不同为止;
  • 2.没有下一个值了 cur->next == nullptr;
    到这时,我们发现会剩下最后一个重复节点有删除,进行单独处理,同时更新prev的值
  1. 终止条件
  • 1.删节点删的 cur == nullptr, 比如像[1,2,5,5,5], 最后的几个节点均是重复节点,删除之后 cur == nullptr
  • 2.前一步是正常后移, prev = cur, cur = cur->next; 但是没有下一个值了,不存在重复节点的问题,直接结束

代码

  • 语言支持:C++
    C++ Code:
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        ListNode* dummyHead = new ListNode(0, head);
        ListNode *prev = dummyHead, *cur = head;
        // 首先保证cur != nullptr, 才可能有cur->next, 不然会报错访问空指针
        while (cur != nullptr && cur->next != nullptr) {
            if (cur->val == cur->next->val) {
                // 处理重复节点(后面一个指针不为nullptr,才有可能存在重复节点问题)
                while (cur->next != nullptr && cur->val == cur->next->val) {
                    ListNode* temp = cur;
                    cur = cur->next;
                    delete temp;
                }
                // 处理最后一个重复节点
                ListNode* temp = cur;
                cur = cur->next;
                prev->next = cur; // 更新prev->next
                delete temp;
            } else {
                prev = cur;
                cur = cur->next;
            }
        }
        return dummyHead->next;
    }
};

复杂度分析

令 n 为数组长度。

  • 时间复杂度:\(O(n)\)
  • 空间复杂度:\(O(1)\)

总结

这题最麻烦的是弄清楚究竟什么时候终止,有哪些可能的情况,尤其是我们讨论 cur->next这种下一个节点的时候,要考虑到有没有可能当前节点cur就是空指针了

标签:力扣,cur,nullptr,next,链表,82,prev,节点
From: https://www.cnblogs.com/trmbh12/p/18169665

相关文章

  • 力扣-83. 删除排序链表中的重复元素
    1.题目题目地址(83.删除排序链表中的重复元素-力扣(LeetCode))https://leetcode.cn/problems/remove-duplicates-from-sorted-list/题目描述给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回已排序的链表 。 示例1:输入:head=[1,1......
  • 双向链表及双向循环链表接口设计
    双向链表及双向循环链表接口设计双向链表接口设计由于带头结点更加方便用户进行数据访问,所以本次创建一条带头结点的双向不循环的链表。创建新的头结点和新节点//数据类型typedefintdatatype_t;//创建结点类型typedefstructdoublelinckelist{datatype_tdata;......
  • 末路狂花钱迅雷BT下载[MP4/1.82GB/5.35GB]超级清晰[HD720p/1080p]
    电影《末路狂花钱》是一部由斯蒂文·索德伯格执导的黑色喜剧电影,于20xx年上映。这部电影讲述了一个普通女人在生活的困境中,决定通过偷窃银行来改变自己的生活轨迹的故事。这部影片将观众带入了一个离奇又荒诞的旅程,展现了金钱和欲望对一个人的影响。 影片的主角是......
  • 双向链表及双向循环链表接口设计
    双向链表及双向循环链表接口设计双向链表接口设计由于带头结点更加方便用户进行数据访问,所以本次创建一条带头结点的双向不循环的链表。创建新的头结点和新节点``//数据类型`typedefintdatatype_t;//创建结点类型typedefstructdoublelinckelist{datatype_tdata;//......
  • 栈_单向链表
    利用单向链表设计一个栈,实现“后进先出”的功能​ 栈内存自顶向下进行递增,其实栈和顺序表以及链式表都一样,都属于线性结构,存储的数据的逻辑关系也是一对一的。​ 栈的一端是封闭的,数据的插入与删除只能在栈的另一端进行,也就是栈遵循“*后进先出*”的原则。也被成为“LIFO”结构,......
  • 力扣-203. 移除链表元素
    1.题目题目地址(203.移除链表元素-力扣(LeetCode))https://leetcode.cn/problems/remove-linked-list-elements/题目描述给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点。 示例1:输入:head=[1,2,6,3,4,5,......
  • TODO-力扣-46. 全排列
    1.题目题目地址(46.全排列-力扣(LeetCode))https://leetcode.cn/problems/permutations/题目描述给定一个不含重复数字的数组nums,返回其所有可能的全排列。你可以按任意顺序返回答案。 示例1:输入:nums=[1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,......
  • 力扣-852. 山脉数组的峰顶索引
    1.题目题目地址(852.山脉数组的峰顶索引-力扣(LeetCode))https://leetcode.cn/problems/peak-index-in-a-mountain-array/?envType=study-plan-v2&envId=primers-list题目描述符合下列属性的数组arr称为山脉数组:arr.length>=3存在i(0<i <arr.length-1)使得: ......
  • 链表逆序
    数据结构链表逆序笔试题:编写一个函数,实现单链表逆序代码//方法一:将尾结点循环插到头节点后面,实现逆序voidreverse_list(single_list*head){single_list*p=head->next;//将链表除头节点的节点保存head->next=NULL;//将链表断开single_list*tmp=......
  • 双向链表
    双向链表接口设计//指的是双向链表中的结点有效数据类型,用户可以根据需要进行修改typedefintDataType_t;//构造双向链表的结点,链表中所有结点的数据类型应该是相同的typedefstructDoubleLinkedList{ DataType_tdata; //结点的数据域 structDoubleLinkedList......