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;
}
};
相关文章
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
40 1
|
3月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
2月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
44 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
2月前
【LeetCode 09】19 删除链表的倒数第 N 个结点
【LeetCode 09】19 删除链表的倒数第 N 个结点
17 0
|
4月前
|
算法
LeetCode第19题删除链表的倒数第 N 个结点
该文章介绍了 LeetCode 第 19 题删除链表的倒数第 N 个结点的解法,通过使用快慢双指针,先将快指针移动 n 步,然后快慢指针一起遍历,直到快指针到达链尾,从而找到倒数第 N 个结点的前一个结点进行删除,同时总结了快慢指针可减少链表遍历次数的特点。
LeetCode第19题删除链表的倒数第 N 个结点
|
6月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
6月前
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表
|
6月前
|
存储 算法 Java
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
65 2
|
7月前
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点.
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点
57 1