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

题目要求

  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 -> 1ListNode *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.rhkb.cn/news/452241.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

点亮一个LED(51)

目录 1.LED介绍 2.硬件电路 3.程序设计 3.1.点亮一颗LED 3.2.LED闪烁 3.3.LED流水灯实现 1.LED介绍 发光二极管也具有二极管普遍的特性单向导电性&#xff0c;有阳极和阴极之分 &#xff0c;上图左侧式插件式LED &#xff0c;长的引脚是阳极&#xff1b;左侧是贴片式的带…

基于FPGA的以太网设计(六)

前面分别实现了ARP协议和ICMP协议&#xff0c;但这俩协议都不能进行数据的传输&#xff0c;如果想要用以太网传输数据的话还需要实现UDP协议或者TCP协议&#xff0c;关于二者的差别主要包括以下几点&#xff1a; 1.连接性 TCP是面向连接的协议&#xff0c;它在传输数据之前需…

UICollectionView 的UICollectionReusableView复用 IOS18报错问题记录

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath 方法复用报错 报错详情&#xff1a; Terminating app due to uncaught exception NSInternal…

Star Tower:智能合约的安全基石与未来引领者

在区块链技术的快速发展中&#xff0c;智能合约作为新兴的应用形式&#xff0c;正逐渐成为区块链领域的重要组成部分。然而&#xff0c;智能合约的可靠性问题一直是用户最为关心的焦点之一。为此&#xff0c;Star Tower以其强大的技术实力和全面的安全保障措施&#xff0c;为智…

win10下带参执行.exe的几种方法

0 工具准备 vscode&#xff0c;编辑C代码 Code Runner插件&#xff0c;用于生成exe1 生成支持带参处理的.exe C源码如下&#xff1a; #include "stdio.h" #include <stdlib.h>int main(int argc, char *argv[]) {int i;printf("argc : %d\r\n", a…

首创VMware vCenter 8.0U3b 无DNS部署秘籍

哈喽大家好,欢迎来到虚拟化时代君(XNHCYL)。 “ 大家好,我是虚拟化时代君,一位潜心于互联网的技术宅男。这里每天为你分享各种你感兴趣的技术、教程、软件、资源、福利…(每天更新不间断,福利不见不散) 第一章、小叙 今天介绍下VMware vCenter 8.0u3b 无DNS部署教…

manjaro kde 磁盘扩容

vmware wprlstatopm 搭建的manjaro kde &#xff0c;初始磁盘太小&#xff08;40G&#xff09;&#xff0c;现在想扩容磁盘空间 &#xff0c;vmware wprlstatopm已从40G调整到140g&#xff0c;manjaro kde 系统却没有变化&#xff0c;请指点manjaro kde 如何磁盘扩容 要在 Man…

【以雅特力AT32为例】CAN过滤器及其原理与邮箱配置

个人认为过滤器的本质就是对ID值&#xff08;局部or全部&#xff09;的比较。 协议层雅特力跟标准CAN略有不同&#xff0c;详见&#xff1a;【雅特力AT32】 MCU CAN入门指南&#xff08;超详细&#xff09; 协议层了解差不多&#xff0c;直接来应用编程实战就好了&#xff0c…

从一个事故中理解 Redis(几乎)所有知识点

作者&#xff1a;看破 一、简单回顾 事故回溯总结一句话&#xff1a; &#xff08;1&#xff09;因为大 KEY 调用量&#xff0c;随着白天自然流量趋势增长而增长&#xff0c;最终在业务高峰最高点期占满带宽使用 100%。 &#xfeff; &#xfeff; &#xff08;2&#xff…

mysql5.7版本用户管理(user表列信息介绍,本质,管理操作),数据库的权限管理(权限列表,权限操作)

目录 用户管理 介绍 user表 介绍 列信息 Host User *_priv authentication_string 用户管理的本质 操作 创建用户 删除用户 修改用户信息 修改密码 自己修改 root用户修改指定用户的密码 数据库的权限 权限列表 给用户授权 查看权限 回收权限 刷新权限 …

GDAL+C#实现矢量多边形转栅格

1. 开发环境测试 参考C#配置GDAL环境&#xff0c;确保GDAL能使用&#xff0c;步骤简述如下&#xff1a; 创建.NET Framework 4.7.2的控制台应用 注意&#xff1a; 项目路径中不要有中文&#xff0c;否则可能报错&#xff1a;can not find proj.db 在NuGet中安装GDAL 3.9.1和G…

【ARM】ARM中断系统详解——以Cortex-A7为例

一、Cortext-A7中断系统简介 Cortex-A7 也有中断向量表&#xff0c;内核有 8 个异常中断&#xff0c;中断向量表也是在代码的最前面。 看起来A7的中断向量表比STM32F103少很多&#xff0c;这是因为STM32F103使用的Cortex-M系列芯片&#xff0c;中断向量表列举出了一款芯片所有…

React Strict DOM:React Native 通用应用程序的未来

Meta宣布发布了 react-strict-dom。从根本上讲&#xff0c;这将改变我们使用 React Native&#xff08;以及在网页上使用 React&#xff09;的方式。它提供了一套统一的 UI 原语&#xff0c;带有样式&#xff0c;可以在网页和移动设备上通用使用&#xff01;现在&#xff0c;“…

package.json 里的 dependencies和devDependencies区别

dependencies&#xff08;依赖的意思&#xff09;&#xff1a; 通过 --save 安装&#xff0c;是需要发布到生产环境的。 比如项目中使用react&#xff0c;那么没有这个包的依赖就会报错&#xff0c;因此把依赖写入dependencies npm install <package-name>// 缩写 np…

【含文档】基于Springboot+Vue的点餐系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

基于直播美颜SDK的实时美颜平台开发指南

随着直播平台的快速发展&#xff0c;用户对视频质量的要求越来越高&#xff0c;尤其是对于美颜效果的需求。为满足这一市场需求&#xff0c;基于直播美颜SDK的实时美颜平台应运而生。本文将探讨如何开发这样一个平台&#xff0c;助力开发者在激烈的竞争中脱颖而出。 一、理解美…

Dorado7 全局缓存当前登录人信息 localStorage

登录成功时赋值 com.gs.mcf.view/index.js // like12 add,20240906,全局缓存当前登录人信息var currentName view.get(#userNameLb).get(tip);if(window.localStorage){localStorage.setItem("currentName", currentName);} 使用 // like12 add,20240906,全局缓存…

软考(网工)——网络安全

文章目录 &#x1f550;网络安全基础1️⃣网络安全威胁类型2️⃣网络攻击类型 &#x1f551;现代加密技术1️⃣私钥密码/对称密码体制2️⃣对称加密算法总结3️⃣公钥密码/非对称密码4️⃣混合密码5️⃣国产加密算法 - SM 系列6️⃣认证7️⃣基于公钥的认证 &#x1f552;Hash …

Java 入门基础篇15 - java构造方法以及认识新的关键字

一 今日目标 构造方法static关键字代码块math类package关键字import关键字 二 构造方法概述 2.1 构造方法描述 构造方法是一个特殊方法&#xff0c;作用是创建对象&#xff0c;对对象进行初始化。 ​ 如&#xff1a; 对对象中的成员进行初始化值 2.1 构造方法的特征 1、方…

集群与分布式

Cluster(集群)概述 当单独一台主机无法承载现有的用户请求量&#xff1b;或者一台主机因为单一故障导致业务中断的时候&#xff0c;就可以增加服务主机数&#xff0c;这些主机在一起提供服务&#xff0c;就叫集群&#xff0c;而用户所看到的依然是单个的主机&#xff0c;用户并…