19 删除链表的倒数第 N 个结点

19. 删除链表的倒数第 N 个结点

中等

相关标签

相关企业

提示

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

 

 这段代码使用了双指针的方法,其中一个指针先走 n 步,然后两个指针一起走,直到第一个指针到达链表末尾,此时第二个指针指向的位置就是要删除的节点。

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

// 链表节点的定义
struct ListNode {
    int val;
    struct ListNode *next;
};

// 删除链表倒数第n个节点的函数
struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {
    // 使用双指针,首先让一个指针先走n步
    struct ListNode *dummy = (struct ListNode *)malloc(sizeof(struct ListNode));
    dummy->next = head;
    struct ListNode *fast = dummy;
    struct ListNode *slow = dummy;

    // 让fast指针先走n步
    for (int i = 0; i <= n; i++) {
        fast = fast->next;
    }
    
    // 当fast指针到达链表末尾时,slow指针就在倒数第n+1个节点
    while (fast != NULL) {
        fast = fast->next;
        slow = slow->next;
    }

    // 删除倒数第n个节点
    struct ListNode *temp = slow->next;
    slow->next = slow->next->next;
    free(temp);

    return dummy->next;
}

// 创建链表节点
struct ListNode* createNode(int val) {
    struct ListNode *newNode = (struct ListNode *)malloc(sizeof(struct ListNode));
    newNode->val = val;
    newNode->next = NULL;
    return newNode;
}

// 打印链表
void printList(struct ListNode *head) {
    struct ListNode *current = head;
    while (current != NULL) {
        printf("%d -> ", current->val);
        current = current->next;
    }
    printf("NULL\n");
}

// 释放链表节点
void freeList(struct ListNode *head) {
    struct ListNode *current = head;
    while (current != NULL) {
        struct ListNode *temp = current;
        current = current->next;
        free(temp);
    }
}

int main() {
    // 创建示例链表:[1, 2, 3, 4, 5]
    struct ListNode *head = createNode(1);
    head->next = createNode(2);
    head->next->next = createNode(3);
    head->next->next->next = createNode(4);
    head->next->next->next->next = createNode(5);

    int n = 2;
    printf("原始链表:");
    printList(head);

    // 删除倒数第n个节点
    head = removeNthFromEnd(head, n);

    printf("删除倒数第%d个节点后的链表:", n);
    printList(head);

    // 释放链表内存
    freeList(head);

    return 0;
}
  1. struct ListNode 定义了链表节点的结构,包含一个整数值 val 和一个指向下一个节点的指针 next

  2. removeNthFromEnd 函数用于删除链表倒数第 n 个节点。它首先创建一个虚拟头节点 dummy,并使用两个指针 fastslow 进行遍历。

  3. createNode 函数用于创建新的链表节点,并返回指向该节点的指针。

  4. printList 函数用于打印链表。

  5. freeList 函数用于释放链表的内存。

  6. main 函数中,首先创建一个示例链表 [1, 2, 3, 4, 5],然后调用 removeNthFromEnd 删除倒数第 n 个节点,并最后打印删除节点后的链表。

在这个代码中,使用了一个虚拟头节点 dummy 的原因是为了简化删除操作的处理。如果不使用虚拟头节点,而直接使用 head,则需要特别处理删除头节点的情况,因为头节点没有前一个节点。这会导致代码中需要额外的条件判断来处理删除头节点的情况,从而增加了复杂性。

通过使用虚拟头节点 dummy,可以确保链表中的每个节点都有一个前一个节点,使得删除操作的处理更加统一和简单。此外,虚拟头节点 dummy 在遍历过程中始终位于链表的开头,不会被删除,因此不会影响最终的结果。

总的来说,使用虚拟头节点 dummy 可以简化代码逻辑,提高代码的可读性和可维护性,尤其是在处理链表的边界情况时。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【剪映】为什么要做音乐版权校验?

为什么要做音乐版权校验&#xff1f; 剪映模板开通同步抖音影集功能后&#xff0c;为了尊重原创音乐以及规避侵权风险&#xff0c;添加背景音乐时&#xff0c;建议您通过版权校验&#xff0c;在确定抖音拥有该音乐的版权后&#xff0c;此模板才可能会被同步抖音影集。

【C语言进阶】深度剖析数据在内存中的存储--上

1. C语言中的数据类型的简单介绍 注&#xff1a;C99标准里面&#xff0c;定义了bool类型变量。这时&#xff0c;只要引入头文件stdbool.h &#xff0c;就能在C语言里面正常使用bool类型。 1.1 在C语言中各类型所占内存空间的大小如下 char类型的数据类型大小为1字节即8比特位。…

MySQL数据库⑨_事务(四个属性+回滚提交+隔离级别+MVCC)

目录 1. 事务的概念和四个属性 2. 事务的支持版本 3. 事务的提交方式 4. 事务的相关演示 4.1 常规操作_回滚_提交 4.2 原子性_演示 4.3 持久性_演示 4.4 begin自动更改提交方式 4.5 单条SQL与事务的关系 5. 事务的隔离级别 5.1 四种隔离级别 5.2 查看与设置隔离级别…

LeetCode、435. 无重叠区间【中等,贪心 区间问题】

文章目录 前言LeetCode、435. 无重叠区间【中等&#xff0c;贪心 区间问题】题目链接及分类思路贪心、区间问题 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技…

2.03 作业

一、选择题 1-4 CCCB 二、填空题 1.传参 2.C 3.using namespace std 4.int i32 a>65 && a<90 5.iE6 三、编程题 3.1 f(‘A’)错误&#xff0c;重载函数中没有char类型 f(10, 23.4)错误&#xff0c;第一个参数是int&#xff0c;第二个是double类…

【精选】java进阶——包和final

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

【开源】JAVA+Vue.js实现高校学院网站

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学院院系模块2.2 竞赛报名模块2.3 教育教学模块2.4 招生就业模块2.5 实时信息模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 学院院系表3.2.2 竞赛报名表3.2.3 教育教学表3.2.4 招生就业表3.2.5 实时信息表 四、系…

LAXCUS分布式操作系统目标:软件算力入口

英伟达现在的市值相当于整个中国股市&#xff01;说明了什么&#xff1f; AI 大潮下&#xff0c;算力就是生产力&#xff0c;也是未来 20 年一切产业的基础&#xff0c;英伟达已经把住硬件算力入口&#xff0c;LAXCUS 分布式操作系统瞄准软件算力入口&#xff0c;做好了&#…

Spring Boot 笔记 010 创建接口_更新用户头像

1.1.1 usercontroller中添加updateAvatar&#xff0c;校验是否为url PatchMapping("updateAvatar")public Result updateAvatar(RequestParam URL String avatarUrl) {userService.updateAvatar(avatarUrl);return Result.success();} 1.1.2 userservice //更新头像…

生成式人工智能(AIGC)之最全详解图解

生成式人工智能&#xff08;AIGC&#xff09;之最全详解图解 1. AIGC的发展历程1.1 AIGC演化重要时间节点AIGC发展历程图OpenAI大语言模型发展进程 1.2技术推进路线 2.AIGC技术场景2.1 技术场景 3.1AIGC相关应用4.AIGC未来发展前景 1. AIGC的发展历程 AIGC&#xff08;AI-Gene…

【EAI 019】Eureka: Human-Level Reward Design via Coding LLM

论文标题&#xff1a;Eureka: Human-Level Reward Design via Coding Large Language Models 论文作者&#xff1a;Yecheng Jason Ma, William Liang, Guanzhi Wang, De-An Huang, Osbert Bastani, Dinesh Jayaraman, Yuke Zhu, Linxi Fan, Anima Anandkumar 作者单位&#xff…

项目排期 - 华为OD统一考试

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 200分 题解&#xff1a; Java / Python / C 题目描述 项目组共有N个开发人员&#xff0c;项目经理接到了M个独立的需求&#xff0c;每个需求的工作量不同&#xff0c;且每个需求只能由一个开发人员独立完成&#xff0…

考研数据结构笔记(2)

线性表 线性表的定义线性表的基本操作lnitList(&L)DestroyList(&L)Listlnsert(&L,i,e)ListDelete(&L,i,&e)LocateElem(L,e)GetElem(L,i)Length(L)PrintList(L)Empty(L)Tips:引用值 小结 根据数据结构的三要素–逻辑结构、数据的运算、存储结构&#xff0c;…

文生图提示词:光线效果

色彩和光线 --光线效果 Lighting Effects 覆盖了光线效果的多个方面&#xff0c;包括光的性质、来源、作用方式以及光与物体相互作用产生的视觉效果&#xff0c;是摄影和视觉艺术中不可或缺的元素。 Soft Light 柔光 Hard Light 硬光 Natural Light 自然光 Artificial Light 人…

勒索病毒最新变种.target勒索病毒来袭,如何恢复受感染的数据?

导言&#xff1a; 在当今数字化时代&#xff0c;数据被视为企业和个人最重要的资产之一。然而&#xff0c;随着技术的进步&#xff0c;网络安全威胁也在不断演变。其中&#xff0c;勒索病毒是一种极具破坏性的威胁&#xff0c;而".target"勒索病毒是近期备受关注的一…

【开源】JAVA+Vue+SpringBoot实现学生综合素质评价系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学生功能2.2 教师功能2.3 教务处功能 三、系统展示四、核心代码4.1 查询我的学科竞赛4.2 保存单个问卷4.3 根据类型查询学生问卷4.4 填写语数外评价4.5 填写品德自评问卷分 五、免责说明 一、摘要 1.1 项目介绍 基于J…

【分布式技术专题】「Zookeeper中间件」Paxos协议的原理和实际运行中的应用流程分析

Paxo算法介绍 Paxos算法是莱斯利兰伯特(Leslie Lamport)1990年提出的一种基于消息传递的一致性算法。 Paxos产生背景 Paxos算法是基于消息传递且具有高度容错特性的一致性算法&#xff0c;是目前公认的解决分布式一致性问题最有效的算法之一&#xff0c;其解决的问题就是在分…

[算法前沿]--059-大语言模型Fine-tuning踩坑经验之谈

前言 由于 ChatGPT 和 GPT4 兴起,如何让人人都用上这种大模型,是目前 AI 领域最活跃的事情。当下开源的 LLM(Large language model)非常多,可谓是百模大战。面对诸多开源本地模型,根据自己的需求,选择适合自己的基座模型和参数量很重要。选择完后需要对训练数据进行预处…

mlxtend,一个非常好用的 Python 库!

前言 Python 的 MLxtend&#xff08;Machine Learning Extensions&#xff09;库是一个强大的工具&#xff0c;为机器学习实验提供了一系列功能强大的扩展和工具。本文将深入探讨 MLxtend 库的核心功能、用法以及如何在机器学习项目中充分发挥其优势。 目录 前言 什么是 MLx…

C++异常特性以及使用

异常 1.C传统的处理错误方式2.异常概念3.异常使用规则抛出和匹配规则 4.异常的重新抛出4.异常安全5.异常规范6.使用自定义的异常7.C标准异常体系7.异常优缺点 1.C传统的处理错误方式 终止程序&#xff1a;如assert&#xff0c;缺陷&#xff1a;用户难以接受。如发生内存错误&a…