当前位置: 首页 > article >正文

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

在这里插入图片描述
思路:
采用双指针,目标是让low指针停在要删除节点的前一个节点处,那么需要fast指针配合定位,以1->2->3->4->5,n=2为例,需要删除的目标节点是4,那么最终low定位在3,fast定位在5,从结尾往前推,当low初始停留在虚拟节点dummy处,fast要停留在2的位置,那我们首先需要一个单层循环把fast指针送过去,根据fast指针初始位置(dummy)和目标位置(2),fast要往前跳两次,由此得出循环条件 i=0;i<n;i++;后续fast和low保持固定间隔同步往前跳,直到fast指针跳到链表最后一个节点(5),停止,删除节点4

在删除操作这需要考虑一些特殊情况,最开始,我只考虑了删除中间节点,所以删除语句用的是low->next=fast;对于中间节点能够正确删除,但是对于删除头节点,比如【1】,n=1的情况就无法正确删除,因为fast可能停留在删除目标节点的后一个也可能停留在删除目标节点本身,fast的不确定性导致了删除语句没办法用fast来参与删除,但是low一定会定位在删除目标节点前一个节点,那么我们可以用**low->next=low->next->next;**进行删除

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {
    struct ListNode* dummy=(struct ListNode*)malloc(sizeof(struct ListNode));//创建虚拟头节点以应对删除头节点的情况
    dummy->next=head;
    struct ListNode *low=dummy;
    struct ListNode *fast=dummy;
    for(int i=0;i<n;i++)
    {
        fast=fast->next;
    }
    while(fast->next!=NULL)
    {
        low=low->next;
        fast=fast->next;
    }
    low->next=low->next->next;
    return dummy->next;
}

http://www.kler.cn/a/612192.html

相关文章:

  • 单片机内存划分总览与介绍
  • 《Python实战进阶》No34:卷积神经网络(CNN)图像分类实战
  • 【C++】httplib:轻量级的 HTTP 服务器和客户端
  • vue 双向绑定的原理是什么
  • Linux Namespace(网络命名空间)系列三 --- 使用 Open vSwitch 和 VLAN 标签实现网络隔离
  • Redis 性能数据解读与问题排查优化版
  • 基于Flask的防火墙知识库Web应用技术解析
  • python爬虫PyQt简介
  • 【QT5 多线程示例】信号量
  • C++学习笔记(二十九)——list
  • 【Linux网络-poll与epoll】epollserver设计(两个版本 Reactor)+epoll理论补充(LT ET)
  • vue ts+Windi CSS
  • CTFshow【命令执行】web29-web40 做题笔记
  • 未来工程项目管理新走向:云原生软件赋能绿色可持续建设
  • Kafka 面试备战指南
  • eureka与ribbon混合使用
  • Linux设置SSH免密码密钥登录
  • Netty和Project Reactor如何共同处理大数据流?
  • 无人机抗风测试技术要点概述!
  • failed to load steamui.dll”错误:Steam用户的高频崩溃问题解析