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

devtools/2024/10/19 13:23:54/

题目要求

  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.ppmy.cn/devtools/125299.html

相关文章

Python 与 Pycharm 的简易安装教程,包含Pycharm的修改

一. 官方网站 Python网址&#xff1a;python唯一的官方网址。 Pycharm网址&#xff1a;Pycharm的官方网址。 二. python安装步骤 滑动到红色框内 Downloads 导航栏。 红色框是选择适合自己电脑系统和版本的部分&#xff0c;蓝色框是选择系统的部分&#xff0c;黄色框是版本号。…

滑雪——记忆化搜索

题目 代码 //#pragma GCC optimize(3)#include <bits/stdc.h> const int N 310; using namespace std; int dx[4] {-1, 0, 1, 0}, dy[4] {0, 1, 0, -1}; int ans; int g[N][N]; int r, c; int f[N][N]; int dfs(int x, int y) {if(~f[x][y]) return f[x][y];f[x][y] …

SQLite Developer使用说明

1.SQLite Developer下载 SQLite Developer官方版是SharpPlus出品的一款数据库管理工具。支持对sqlite3数据库的管理&#xff0c;能够自动完成窗口显示和执行数据库命令等多种特色。并且支持打开.db文件&#xff0c;适用于Android的开发。另外&#xff0c;使用Sqlite Developer…

TCP/IP协议栈

一、TCP/IP和OSI模型的比较 相同点 两者都是以协议栈的概念为基础 协议栈中的协议彼此相互独立 下层对上层提供服务 不同点 OSI是先有模型&#xff1b;TCP/IP是先有协议&#xff0c;后有模型 OSI是国际标准&#xff0c;适用于各种协议栈&#xff1b;TCP/IP实际标准&…

opencv-rust 系列: 1, 安装及运行自带示例和测试程序

opencv-rust 系列: 1, 安装及运行自带示例和测试程序 运行环境: ubuntu ; rust 已安装; 对rust的掌握为三脚猫程度一. opencv-rust安装:二. 运行自带examples和tests 运行环境: ubuntu ; rust 已安装; 对rust的掌握为三脚猫程度 一. opencv-rust安装: 安装软件: sudo apt in…

我们是如何将Docker构建时间缩短40%的

by: WL Mapmost从设计之初&#xff0c;便选择了云原生道路&#xff0c;在软件开发过程中自然也少不了容器化技术的使用。当然&#xff0c;我们也为Mapmost产品中使用的所有组件构建了 docker 镜像。然而&#xff0c;随着时间的推移&#xff0c;其中一些镜像变得越来越大&#…

Oracle架构之段管理和区管理

文章目录 1 段1.1 简介1.1.1 定义1.1.2 分类 1.2 段空间的管理模式1.2.1 手工段空间管理&#xff08;Manual Segment Space Management&#xff09;1.2.2 自动段空间管理&#xff08;Auto Segment Space Management&#xff09; 1.3 段空间的手工管理&#xff08;Manual Segmen…

面向B2B市场的Spring Boot医疗病历系统开发

第1章绪论 计算机已经从科研院所&#xff0c;大中型企业&#xff0c;走进了平常百姓家&#xff0c;Internet遍及世界各地&#xff0c;在网上能够用计算机进行文字草拟、修改、打印清样、文件登陆、检索、综合统计、分类、数据库管理等&#xff0c;用科学的方法将无序的信息进行…