LeetCode刷题(18)【中等】删除链表的倒数第 N 个结点(C++)

简介: LeetCode刷题(18)【中等】删除链表的倒数第 N 个结点(C++)

@[TOC](删除链表的倒数第 N 个结点

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

在这里插入图片描述

题目——链接](https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/))

遍历统计方法

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        if(!head)//空的直接返回
        {
            return NULL;
        }
        int count =  0;//统计个数
        ListNode* tempnode = head;
        ListNode* temp = NULL;
         int prev = 0;
        while(tempnode)
        {
            count++;
            tempnode = tempnode->next;
        }

        tempnode = head;
       
       //一共就一个,也一并算到删除第一个结点
        if(count == n)
        {
            temp = head;
            head = head->next;
            delete temp;
            return head;
        }
   
        //删除第一个结点之后的结点
        //循环拿到要删除结点的前一个结点
        while(prev != count -n)
        {
            prev++;
            //此时已经到了要删除结点的前一个结点,break
            if(prev == count-n)
            {
                break;
            }
            tempnode = tempnode->next;
        }
        //只有一个元素 or 删除第一个结点的时候得单独讨论,此方法不适用,越界了
        //由此可以理解为什么有的方法用了哨兵结点了,这样可以删除头结点
        temp =tempnode->next;
        tempnode->next = temp->next;
        delete temp;

        return head;

    }
};

哨兵结点

在上面方法的基础上加入一个哨兵结点。

哨兵结点的next指向head。

(LeetCode中的head都是带数据的)

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        if(!head)//空的直接返回
        {
            return NULL;
        }
        int count =  0;//统计个数
        int prev = -1;
        ListNode* temp = NULL;
        ListNode* tempHead = new ListNode;
        ListNode* tempnode = head;

        tempHead->next = head;
        while(tempnode)
        {
            count++;
            tempnode = tempnode->next;
        }

        tempnode = tempHead;
        while(prev !=count-n)
        {
            prev++;
            if(prev == count-n)
            {
                break;
            }
            tempnode =tempnode->next;
        }

        temp = tempnode->next;
        tempnode->next=  temp->next;
        delete   temp;
        return tempHead->next;

    }
};

快慢指针+哨兵结点

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
    //快慢指针都先指向新的头结点
    //快指针比慢指针先走n步
    //然后同时出发
    //当fast走到最后一个结点时,此时slow的下一个结点就是要删除的结点
    if(!head)
    {
        return NULL;
    }
    ListNode* tempHead = new ListNode;
    ListNode* temp = NULL;
    int count = 0;
    ListNode* slow = tempHead;
    ListNode* fast =tempHead;
    tempHead ->next = head;
    while(count != n)
    {
        fast = fast->next;
        count++;
    }    
    while(fast->next)
    {
        fast = fast->next;  
        slow = slow->next;
    }
    temp = slow->next;
    slow->next = temp->next;

    delete   temp;
    return tempHead->next;
}
};
相关文章
|
算法
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
356 1
|
存储 监控 算法
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
333 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
链表的中间结点
链表的中间结点
494 57
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】
本内容介绍了单链表的基本运算任务,涵盖线性表的基本概念、初始化、销毁、判定是否为空表、求长度、输出、求元素值、按元素值查找、插入和删除数据元素等操作。通过C++代码示例详细解释了顺序表和链表的实现方法,并提供了测试说明、通 - **任务描述**:实现单链表的基本运算。 - **相关知识**:包括线性表的概念、初始化、销毁、判断空表、求长度、输出、求元素值、查找、插入和删除等操作。 - **测试说明**:平台会对你编写的代码进行测试,提供测试输入和预期输出。 - **通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了测试通过后的预期输出结果。 开始你的任务吧,祝你成功!
710 5
|
存储 算法 搜索推荐
链表的中间结点
【10月更文挑战第24天】链表的中间结点是链表操作中的一个重要概念,通过快慢指针法等方法可以高效地找到它。中间结点在数据分割、平衡检测、算法应用等方面都有着重要的意义。在实际编程中,理解和掌握寻找中间结点的方法对于解决链表相关问题具有重要价值。
456 1
【LeetCode 09】19 删除链表的倒数第 N 个结点
【LeetCode 09】19 删除链表的倒数第 N 个结点
287 0
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
456 6
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
241 6
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
558 2
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
467 4
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口