C语言刷题 LeetCode 删除单链表的重复节点 双指针法

news2025/4/13 22:42:29

题目要求

  1. 链表结构:题目中提到的是未排序的链表,链表是由一系列节点组成的,每个节点包含一个值(数据)和一个指向下一个节点的指针。
  2. 去重:我们需要遍历链表,删除所有重复的节点,只保留每个值第一次出现的节点。
  3. 输出结果:输出去重后的链表。

示例解释

  • 示例1

    • 输入: [1,2,3,3,2,1]
      • 链表结构为: 1 -> 2 -> 3 -> 3 -> 2 -> 1
      • 处理后: 去掉重复的 32 之后,结果是 1 -> 2 -> 3
    • 输出: [1, 2, 3]
  • 示例2

    • 输入: [1,1,1,1,2]
      • 链表结构为: 1 -> 1 -> 1 -> 1 -> 2
      • 处理后: 去掉重复的 1,结果是 1 -> 2
    • 输出: [1, 2]

关键点

  1. 链表的遍历:我们需要遍历整个链表来找出并删除重复的节点。
  2. 存储已出现的值:我们需要一种方式来跟踪已经出现的节点值,以便知道哪些需要删除。这个可以使用额外的存储结构(如哈希表)来实现。
  3. 双指针技巧:在进阶要求中,不能使用临时缓冲区,这时可以用双指针的方式直接在链表中进行比较和删除。

不使用临时缓冲区(双指针法)

#include <stdio.h>
#include <stdlib.h>

typedef struct ListNode {
    int val;
    struct ListNode *next;
} ListNode;

// 移除重复节点的函数
ListNode* removeDuplicates(ListNode* head) {
    if (!head) return NULL;

    ListNode *current = head;

    while (current) {
        ListNode *runner = current;
        // 检查当前节点后面的节点
        while (runner->next) {
            if (runner->next->val == current->val) {
                // 找到重复节点,删除它
                ListNode *temp = runner->next;
                runner->next = runner->next->next; // 跳过重复节点
                free(temp); // 释放重复节点的内存
            } else {
                runner = runner->next; // 否则继续前进
            }
        }
        current = current->next; // 移动到下一个节点
    }

    return head;
}

// 辅助函数: 创建新节点
ListNode* createNode(int val) {
    ListNode *newNode = (ListNode *)malloc(sizeof(ListNode));
    newNode->val = val;
    newNode->next = NULL;
    return newNode;
}

// 辅助函数: 打印链表
void printList(ListNode *head) {
    while (head) {
        printf("%d ", head->val);
        head = head->next;
    }
    printf("\n");
}

// 示例用法
int main() {
    // 构建链表: 1 -> 2 -> 3 -> 3 -> 2 -> 1
    ListNode *head = createNode(1);
    head->next = createNode(2);
    head->next->next = createNode(3);
    head->next->next->next = createNode(3);
    head->next->next->next->next = createNode(2);
    head->next->next->next->next->next = createNode(1);

    printf("Original list: ");
    printList(head);

    head = removeDuplicates(head);

    printf("List after removing duplicates: ");
    printList(head);

    // 释放链表内存
    while (head) {
        ListNode *temp = head;
        head = head->next;
        free(temp);
    }

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2212192.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开源新生活,社区齐乐活:COSCon'24 社区合作和开源集市招募中,诚邀广大社区参与!...

一年一度的开源盛会&#xff0c;COSCon24第九届中国开源年会暨开源社10周年嘉年华&#xff0c;将于11月2-3日&#xff0c;在北京•中关村国家自主创新示范区展示中心召开&#xff01;本次大会的主题是&#xff1a;「Open Source&#xff0c;Open Life | 开源新生活」&#xff0…

react antd redux 全局状态管理 解决修改菜单状态 同步刷新左侧菜单

npm i react-redux1.src新建两个文件 globalState.js 全局状态定义 store.js 全局存储定义 2.globalState.js import { createSlice } from "reduxjs/toolkit";export const globalState createSlice({name: "globalState",initialState: { data: {} },r…

Qt 学习第 天:QPainter类

一、先创建一个widget窗口 二、包含头文件 #include <QPainter> #include <QFont> 三、在widget.h中声明paintEvent函数 使用画家类在窗口中画图, 操作必须在paintEvent函数中完成 #ifndef WIDGET_H #define WIDGET_H#include <QWidget>namespace Ui { cla…

Spring Boot框架下的知识管理自动化

3系统分析 3.1可行性分析 通过对本知识管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本知识管理系统采用JAVA作为开发语言&#xff0c;Spring Boot框…

C语言题目练习3

这一篇博客也来看看和链表有关的题目~ 反转链表 反转链表&#xff1a; https://leetcode.cn/problems/reverse-linked-list/description/ 这个题目已经十分清晰了&#xff0c;那我们可以怎么做呢&#xff1f; 结合前面单链表的知识点&#xff0c;我们很容易可以想到第一个思路…

RTC -

RTC 目录 RTC 回顾 RTC 如何实现RTC制作一个时钟日历 代码编写 rtc.c完整代码 模块开发的步骤&#xff1a; 1、找文档 2、 在文档里面找通信方式&#xff0c;通信过程&#xff08;协议&#xff09; 3、代码> -- 前面学的是模块的开发&#xff0c;串口类&#xff0c;I…

决策树和集成学习的概念以及部分推导

一、决策树 1、概述 决策树是一种树形结构&#xff0c;树中每个内部节点表示一个特征上的判断&#xff0c;每个分支代表一个判断结果的输出&#xff0c;每个叶子节点代表一种分类结果 决策树的建立过程&#xff1a; 特征选择&#xff1a;选择有较强分类能力的特征决策树生成…

【论文阅读】SRCNN

学习资料 论文题目&#xff1a;Learning a Deep Convolutional Network for Image Super-Resolution&#xff08;学习深度卷积网络用于图像超分辨率&#xff09;论文地址&#xff1a;link.springer.com/content/pdf/10.1007/978-3-319-10593-2_13.pdf代码&#xff1a;作者提出的…

Java 一维数组作为函数参数

//一维数组的引用 #define SIZE 5 void input(int a[], int len); void output(int a[], int len);//函数的声明 int main(void) { int i 0; int arr[SIZE] { 86,85,85,896,45 };//同理五个数据只是偶然&#xff0c;可能会更多 //输入 input(arr, SIZE); …

目标检测系统操作说明【用户使用指南】(python+pyside6界面+系统源码+可训练的数据集+也完成的训练模型)

1.链接&#xff1a;上百种【基于YOLOv8/v10/v11的目标检测系统】目录&#xff08;pythonpyside6界面系统源码可训练的数据集也完成的训练模型&#xff09; 2.目标检测系统【环境搭建过程】&#xff08;GPU版本&#xff09; 3.目标检测系统【环境详细配置过程】&#xff08;CP…

241012-绿联UGOSPro-在仅无线WLAN网络条件下添加虚拟机网络

A. 新建NAT模式的虚拟子网 虚拟机-管理-网络管理-添加网络-如下设置 B. 虚拟机网络选择 C. 不同网络的对比 support.ugnas.com Virtio、e1000和rtl8139有什么区别&#xff0c;在创建虚拟机时&#xff0c;我应该如何选择&#xff1f; Virtio、e1000和rtl8139是三种不同的虚拟…

[论文阅读]SCOTT: Self-Consistent Chain-of-Thought Distillation

中文译名&#xff1a;SCOTT: 思维链一致性蒸馏 会议&#xff1a;Proceedings of the 61st Annual Meeting of the Association for Computational Linguistics (Volume 1: Long Papers) 链接&#xff1a;SCOTT: Self-Consistent Chain-of-Thought Distillation - ACL Antholo…

MySQL【知识改变命运】05

1&#xff1a;where的基本用法练习&#xff08;比较运算符&#xff09; 基本操作&#xff1a;查询英语<60的同学 如果english为NULL&#xff0c;会自动过滤掉&#xff0c;NULL比较特殊 查询语⽂成绩⾼于英语成绩的同学 这个过程&#xff1a;先读取表中每行记录&#xf…

18925 试卷排序(双向链表)

### 思路 1. **初始化队列**&#xff1a;将编号为1的试卷放入队列。 2. **依次插入试卷**&#xff1a;从第2张试卷开始&#xff0c;根据输入的x和p&#xff0c;将试卷插入到指定位置。 3. **输出结果**&#xff1a;输出最终的试卷序列。 ### 伪代码 function reorder_papers(…

计算机的错误计算(一百二十二)

摘要 讨论 的计算精度问题。 例1. 已知 计算 不妨在 Excel 的单元格中计算&#xff0c;则有&#xff1a; 若在Python下计算&#xff0c;则输出似乎更精确&#xff1a; 然而&#xff0c;16位有效数字的正确结果为 0.4999999999940000&#xff08;ISRealsoft 提供&#…

Matlab 多机器人编队数据分析

文章目录 前言一、Function quiver not supported for code generation.二、在仿真环境中添加障碍物三、simulink中function函数初始化五、在MATLAB中&#xff0c;实现在绘图时只删除上一次绘制的图形而不是整个图形界面六、matlab simulink中&#xff0c;程序不断发出机器人位…

git的学习使用(搭建本地仓库,创建本地仓库,配置本地仓库)(附带Ubuntu云服务器git安装流程)

学习目标&#xff1a; 学习使用git&#xff0c;并且熟悉git的使用 学习内容&#xff1a; 必备环境&#xff1a;xshell&#xff0c;Ubuntu云服务器 如下&#xff1a; 搭建 git 环境掌握 Java 基本语法掌握条件语句掌握循环语句 搭建git环境&#xff1a; 1、先检查自己的云服…

vscode的一些概念和原理,插件系统简单上手指南

VScode 技术栈和架构 使用的技术栈&#xff1a; Electron。Typescript。Node.js。Monaco Editor。 代码编辑器 主进程 (Main Process): 负责应用的生命周期管理、菜单、系统托盘等操作系统相关的功能。Electron 的主进程还负责启动渲染进程&#xff0c;并提供与 Node.js 之间…

Excel:多种方法实现1列转多列表格(含vba实现)

要求&#xff1a;将A列中的名字放到右边的表格里面 一、当数据较少的时候手动实现更快 实现的步骤&#xff1a; 1.先按照下面的方式填充右边的表格 然后选中a2、a7所在的前两行进行下拉填充 2.填充完毕表格的样子 3.选中该表格所在的区域 → 点击菜单栏“开始” → 查找 → 替…

python之selenium接管打开的谷歌浏览器窗口——隐藏爬虫特征,跳过登陆弹窗验证

文章目录 引言使用selenium接管打开的谷歌浏览器总结 引言 我们知道通过selenium打开的浏览器与本地电脑上打开的浏览器是不同的&#xff0c;selenium通过插件打开浏览器页面会显示爬虫特征信息&#xff0c;且在访问某些网站时&#xff0c;很容易被检测出是一个爬虫机器&#x…