首页 > 编程语言 >LeetCode_LinkedList_82. Remove Duplicates from Sorted List II 删除排序链表中的重复元素 II(C++)

LeetCode_LinkedList_82. Remove Duplicates from Sorted List II 删除排序链表中的重复元素 II(C++)

时间:2022-10-27 16:31:21浏览次数:79  
标签:链表 head LinkedList list next II flag 节点


目录

​一,题目描述​

​英文描述​

​中文描述​

​二,解题思路​

​三,AC代码​

​C++​

​四,解题过程​

​第一博​


一,题目描述

英文描述

Given the head of a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list. Return the linked list sorted as well.

Example 1:

LeetCode_LinkedList_82. Remove Duplicates from Sorted List II 删除排序链表中的重复元素 II(C++)_leetcode


Example 2:

 

LeetCode_LinkedList_82. Remove Duplicates from Sorted List II 删除排序链表中的重复元素 II(C++)_leetcode_02

Constraints:

The number of nodes in the list is in the range [0, 300].
-100 <= Node.val <= 100
The list is guaranteed to be sorted in ascending order.

中文描述

存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。

返回同样按升序排列的结果链表。


示例 1:

LeetCode_LinkedList_82. Remove Duplicates from Sorted List II 删除排序链表中的重复元素 II(C++)_数据结构_03


示例 2:

LeetCode_LinkedList_82. Remove Duplicates from Sorted List II 删除排序链表中的重复元素 II(C++)_链表_04


提示:

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

来源:力扣(LeetCode)
链接:​​​https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii​​ 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二,解题思路

主要思路是:一个指针p指向已处理部分的最后一个节点,另一个指针q负责遍历其余节点,若遇到重复的地方q指针便一直向后遍历,直到q->val != q->next->val,则将重复的一段切掉(p->next = q->next)。

但是一个细节比较难搞,就是怎么移动p指针。

这里借用了一个布尔变量flag,当flag为true时,表明q指针遍历的节点属于重复的一段,那么当q->val != q->next->val时,便可以p->next = q->next,截断这重复的部分。

当flag为false时,表明q指针遍历的节点无重复,p移到q的位置即可。

三,AC代码

C++

class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head == nullptr || head->next == nullptr) return head;
ListNode* h = new ListNode;
h->next = head;
ListNode* p = h, * q = head;
// 标记q指针遍历的节点是否存在重复
bool flag = false;
while (q->next != nullptr) {
if (q->val == q->next->val) {
flag = true;
q = q->next;
} else {
if (flag) p->next = q->next;
else p = q;

q = q->next;
flag = false;
}
}
if (flag) p->next = q->next;
return h->next;
}
};

四,解题过程

第一博

终于。。。这一题看似平淡无奇,但细节部分想不明白还是非常头疼的。

LeetCode_LinkedList_82. Remove Duplicates from Sorted List II 删除排序链表中的重复元素 II(C++)_数据结构_05

标签:链表,head,LinkedList,list,next,II,flag,节点
From: https://blog.51cto.com/u_15849465/5801582

相关文章

  • 单向链表
    单向链表链表的简介链表和数组一样,可以用于存储一系列的元素,但是链表和数组的实现机制完全不同。链表的每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(有......
  • LeetCode_Array_63. Unique Paths II (C++)
    目录​​1,题目描述​​​​2,思路​​​​3,代码​​​​4,测试结果​​1,题目描述Arobotislocatedatthetop-leftcornerofamxngrid(marked'Start'inthediagra......
  • 力扣 107. 二叉树的层序遍历 II
    107.二叉树的层序遍历II给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。(即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)示例1:输入:r......
  • leetcode 234. 回文链表 js 实现
    给你一个单链表的头节点head,请你判断该链表是否为回文链表。如果是,返回true;否则,返回false。 示例1:输入:head=[1,2,2,1]输出:true示例2:输入:head=[1,2]输出......
  • 数据结构 玩转数据结构 4-1 什么是链表
    0课程地址https://coding.imooc.com/lesson/207.html#mid=13429 1重点关注1.1什么是链表数据存在节点中的一种线性数据结构  1.2......
  • leetcode 206. 反转链表 js实现
    给你单链表的头节点head,请你反转链表,并返回反转后的链表。 示例1:输入:head=[1,2,3,4,5]输出:[5,4,3,2,1]示例2:输入:head=[1,2]输出:[2,1]示例3:输入:head=[]输出......
  • 力扣-92-反转链表Ⅱ
    其实对链表的考察就是考察指针,不喜欢Java写算法题的一大原因就是Java没有指针区间反转链表,相对于整体反转链表而言回忆一下链表的整体反转,大概是两种做法递归,从后往前......
  • 链表——环形链表
    classSolution{public:ListNode*detectCycle(ListNode*head){ListNode*fast=head;ListNode*slow=head;while(fast!=NULL&......
  • 【数据结构-链表】链表的基本操作
    目录1单向链表1.1有头结点的单向链表1.1.1数据结构定义1.1.2初始化建立链表1.1.3按序号查找结点1.1.4按值查找结点1.1.5插入操作1.1.6删除操作1.2无头结点的单向......
  • 链表——删除链表倒数第n个节点
    classSolution{public: ListNode*deleteback(ListNode*head,intn) { ListNode*dummyHead=newListNode(0); dummyHead->next=head; ListNode*fast......