首页 > 其他分享 >leetcode 021:删除链表的倒数第 N 个结点

leetcode 021:删除链表的倒数第 N 个结点

时间:2024-08-03 22:23:51浏览次数:9  
标签:dummy next 链表 second 021 节点 倒数第 first

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

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

示例 1:

输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]

示例 2:

输入:head = [1], n = 1
输出:[]

示例 3:

输入:head = [1,2], n = 1
输出:[1]

struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {
    // 创建一个哑节点,其next指向头节点,方便处理边界情况
    struct ListNode* dummy = malloc(sizeof(struct ListNode));
    dummy->val = 0, dummy->next = head;
    
    // 初始化两个指针,first指向链表头部,second指向哑节点
    struct ListNode* first = head;
    struct ListNode* second = dummy;
    
    // 首先移动first指针n个节点,这样first和second之间的距离就是n
    for (int i = 0; i < n; ++i) {
        first = first->next;
    }
    
    // 如果first已经到达链表末尾,说明需要删除的是头节点
    if (first == NULL) {
        dummy->next = head->next; // 哑节点的next指向头节点的后继节点
        free(head); // 释放头节点
        struct ListNode* ans = dummy->next; // 返回新的头节点
        free(dummy); // 释放哑节点
        return ans;
    }
    
    // 然后移动first和second指针,直到first到达链表末尾
    while (first) {
        first = first->next; // first继续向后移动
        second = second->next; // second也向后移动,保持first和second之间的距离为n
    }
    
    // 此时second指向要删除节点的前一个节点
    // 删除操作:将second的next指向要删除节点的后继节点
    second->next = second->next->next;
    
    // 从哑节点的next获取更新后的链表头节点
    struct ListNode* ans = dummy->next;
    
    // 释放哑节点,此时链表已经通过哑节点和删除操作更新,不再需要哑节点
    free(dummy);
    
    // 返回更新后的链表头节点
    return ans;
    

    
}

标签:dummy,next,链表,second,021,节点,倒数第,first
From: https://blog.csdn.net/weixin_75253037/article/details/140898127

相关文章

  • C++实现静态链表
    #include<iostream>usingnamespacestd;//定义静态链表的最大容量constintMAX_SIZE=100;//节点类classNode{public:intdata;//节点存储的数据intnext;//节点指向下一个节点的索引(在数组中的位置)//默认构造函数Node():data(0......
  • 链表part01
    今天是8月2日,学习了链表的基础知识。题目主要是链表的基础操作和反转链表,注意虚拟头节点的使用、next的顺序和tmp的灵活使用。1.移除元素题目:给一个链表的头节点head和整数val,请删除链表中所有满足Node.val==val的节点,并返回新的头节点。删除的方法,cur指针挨个遍......
  • 结构体与共用体,链表的学习
    结构体定义        C语言允许用户自己定义一种数据结构,称为结构体。        声明一个结构体类型一般形式为:                strcut 结构体名                {                    成员列表......
  • 141.环形链表
    给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从0开始)。注意:pos 不作为参数进行传递 。仅仅是为......
  • LeetCode | 单链表操作
    LeetCode203移除链表元素LeetCode707设计链表LeetCode206反转链表主类ListNodepackagecom.github.dolphinmind.linkedlist.uitls;/***@authordolphinmind*@ClassNameListNode*@description*@date2024/8/3*///链表组成元素:节点publicclass......
  • 信友队集训营--1--链表
    算法随笔(1):信友队集训营--1--链表链表单向链表计算机常见的两种存储结构分别是顺序存储和链式存储顺序存储(以数组方式呈现)优点有:操作方便,随机存取,查找元素的时间复杂度为O(1)缺点有:需要预设空间,过大浪费,过小越界。插入或删除元素不方便,需要O(N)的复杂度链式存储(以链表方式呈现)......
  • Python数据结构第二天—循环链表、树、二叉搜索树
    双向链表之前学习的单向链表只能从头遍历到尾,过程是单向的,而双向链表既可以从头遍历到尾,也可以从尾遍历到头,它的过程是双向的。既然它是双向的,那么我们要实现一个双向链表,就需要在单向链表的基础上,给每一个结点增加一个向前的引用。双向链表的创建:"""我们要实现的是一......
  • 链表尾插法、头删、尾删,共用体、位运算。
    一、链表1、尾插程序:2、头删3、尾删4、清空链表二、共用体1、定义:union 共用体名(首字母大写。所占字节大小:结构体变量所占内存长度是各成员占的内存长度之和。每个成员分别占有其自己的内存单元。共用体变量所占的内存长度等于最长的成员的长度。但是整体大......
  • c语言结构体的概述,定义结构体变量类型的方法,结构体变量的引用,结构体变量的初始化,结构
    1.C语言结构体的概述在C语言中,结构体(struct)是一种复合数据类型,用于将不同类型的数据组合在一起。它可以包含基本数据类型(如int、float、char等)以及其他结构体。结构体非常适合表示具有多种属性的复杂数据,如学生信息(包含姓名、年龄、成绩等)或坐标点(包含x和y坐标)。结构......
  • 【数据结构算法经典题目刨析(c语言)】判断链表是否有环(图文详解)
    ......