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

news/2025/1/15 18:57:47/文章来源:https://www.cnblogs.com/zeta186012/p/18412217

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

【问题描述】

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

示例一:
输入:head = [1], n = 1
输出:[]示例二:
输入:head = [1,2], n = 1
输出:[1]

提示:

  • 链表中结点的数目为 sz
  • 1 <= sz <= 30
  • 0 <= Node.val <= 100
  • 1 <= n <= sz

【算法设计思想】

在解决本题时,笔者主要是进行了一次遍历链表得到了其长度length,然后再用总长度length减去n得到我们的target,进而问题就迎刃而解了。

在这里我们复习一下单链表中的经典关键语句,求长度的代码:

int length = 0;while(p != NULL){p = p -> next;length++;
}

或者这样写:

int length = 1;while(p ->next != NULL){length++;p = p -> next;
}

【算法描述】

C++:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/class Solution {
public:/*** 删除链表中倒数第 n 个节点,并返回链表的头节点** @param head 链表的头节点指针* @param n 需要删除的倒数第 n 个节点* @return 返回删除节点后的链表头指针*/ListNode* removeNthFromEnd(ListNode* head, int n) {// 1. 计算链表的长度ListNode* p = head;int length = 1;  // 从1开始计数while (p->next != nullptr) {length++;p = p->next;}// 2. 计算需要删除节点的正向位置int target = length - n;// 3. 如果需要删除的是头节点if (target == 0) {ListNode* temp = head;      // 保存当前头节点的指针head = head->next;          // 更新头节点指针delete temp;                // 删除原头节点return head;                // 返回新的头节点}// 4. 遍历到目标节点的前一个节点ListNode* prev = head;for (int i = 0; i < target - 1; i++) {prev = prev->next;}// 5. 删除目标节点ListNode* temp = prev->next;    // 目标节点prev->next = temp->next;        // 跳过目标节点,重新连接链表delete temp;                    // 删除目标节点// 6. 返回删除后的链表头节点return head;}
};

Java:

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/class Solution {/*** 删除链表中倒数第 n 个节点,并返回链表的头节点* * @param head 链表的头节点* @param n 需要删除的倒数第 n 个节点* @return 返回删除节点后的链表头节点*/public ListNode removeNthFromEnd(ListNode head, int n) {// 1. 计算链表的长度int length = 1;ListNode p = head;while (p.next != null) {length++;p = p.next;}// 2. 计算需要删除节点的正向位置int target = length - n;// 3. 如果需要删除的是头节点if (target == 0) {ListNode temp = head;   // 保存当前头节点head = head.next;       // 更新头节点为下一个节点temp = null;            // 将原头节点引用设为 null,帮助垃圾回收return head;            // 返回新的头节点}// 4. 遍历到目标节点的前一个节点ListNode prev = head;for (int i = 0; i < target - 1; i++) {prev = prev.next;    // 移动到目标节点的前一个节点}// 5. 删除目标节点ListNode temp = prev.next;   // 目标节点prev.next = temp.next;       // 跳过目标节点,重新连接链表temp = null;                 // 将目标节点引用设为 null,帮助垃圾回收// 6. 返回删除后的链表头节点return head;}
}

Python:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = nextclass Solution:def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:# 1. 计算链表的长度p = headlength = 1  # 初始化长度为1,因为我们将至少有一个节点while p.next is not None:length += 1  # 遍历链表,增加长度p = p.next  # 移动指针到下一个节点# 2. 计算需要删除节点的正向位置target = length - n# 3. 如果需要删除的是头节点if target == 0:temp = head  # 保存当前头节点head = head.next  # 更新头节点为下一个节点del temp  # 删除原头节点return head  # 返回新的头节点# 4. 遍历到目标节点的前一个节点prev = headfor i in range(target - 1):prev = prev.next  # 移动指针到目标节点的前一个节点# 5. 删除目标节点temp = prev.next  # 目标节点prev.next = temp.next  # 跳过目标节点,重新连接链表del temp  # 删除目标节点# 6. 返回删除后的链表头节点return head

C:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {// 1. 计算链表的长度struct ListNode* p = head;int length = 1;  // 初始化长度为1,因为我们将至少有一个节点while (p->next != NULL) {length++;p = p->next;  // 移动指针到下一个节点}// 2. 计算需要删除节点的正向位置int target = length - n;// 3. 如果需要删除的是头节点if (target == 0) {struct ListNode* temp = head;  // 保存当前头节点head = head->next;            // 更新头节点为下一个节点free(temp);                   // 释放原头节点的内存return head;                 // 返回新的头节点}// 4. 遍历到目标节点的前一个节点struct ListNode* prev = head;for (int i = 0; i < target - 1; i++) {prev = prev->next;  // 移动到目标节点的前一个节点}// 5. 删除目标节点struct ListNode* temp = prev->next;  // 目标节点prev->next = temp->next;            // 跳过目标节点,重新连接链表free(temp);                         // 释放目标节点的内存// 6. 返回删除后的链表头节点return head;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pytorch安装(GPU_Windows,安装过CPU版的想再次安装GPU)

看过我之前那篇【Pytorch安装 CPU版本】的朋友应该知道,Pytorch安装步骤很复杂。但是其实弄清楚整个逻辑会简单很多,本篇为PytorchGPU安装。如果有朋友跟着我之前的帖子安装过的,想再安装一个GPU的,可以跟着我一起安装一下。我会把我遇到的坑以及经验都给大家分享一下。 Py…

STM32F103C8T6软件安装

本教程参考b站视频教程(STM32入门教程-2023版 细致讲解 中文字幕,第三集P3软件安装),将从一下几个方面进行安装: 1.安装Keil5 MDK软件 2.安装器件支持包 3.软件注册 4.安装ST-LINK驱动 5.安装USB转串口驱动 一、安装Keil5 MDK软件 找到软件的下载链接:https://jiangxieke…

基于pikachu靶场的水平越权详解

1. pikachu靶场搭建 如果你在之前已经使用过phpstudy了,参考pikachu 靶场环境搭建 如果没有,参考pikachu 靶场搭建 如果在靶场搭建中遇到一些问题,参考皮卡丘靶场搭建遇到的问题大全 2. 水平越权简介 水平越权是指攻击者通过获取与自己拥有相同权限级别的其他用户的访问权限…

如何实现两个机器时间同步-计算rtt+offset

背景: 之前的项目大致可以分为两层,逻辑层和设备层,运行在同一个主机上。最近在着手搭建一个仿真平台,在另外一台主机上部署机器人机器相关硬件设备,比如陀螺仪,轮机,雷达等。 由于两台主机的时间戳不同步问题,导致定位系统有问题,为此需要实现两个主机的时间同步。 具…

C# 操作xml(转)

四、xml 1、概念:XML可扩展的标记语言类似于HTML XML:存储数据 注意: XM工是严格区分大小写的。 XML标签也是成对出现的。 2、通过代码来创建xML文档 1、引用命名空间 using System.Xml; 2、创建XML文档对象 XmlDocument doc = new XmlDocument(); 3、创建第一行描述信息,并且…

代码随想录突击版刷题

704.二分查找 https://leetcode.cn/problems/binary-search/description/ 59.螺旋矩阵IIhttps://leetcode.cn/problems/spiral-matrix-ii/description/、 参考题解写出54.螺旋矩阵https://leetcode.cn/problems/spiral-matrix/description/class Solution { public:vector<i…

高精地图(HD map)的简单介绍

高精度语义地图的动态构建-HDMapNet - 知乎 (zhihu.com)

fastDFS - 单机部署 + nginx

准备查看操作系统的版本信息[root@lab10 ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)查看操作系统的网卡地址[root@lab10 ~]# ip address show ens32 2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group def…

python 获取163 邮箱的邮件信息

此案例是是获取的一个亚马逊的验证码 import time from imaplib import IMAP4_SSL import imaplib,email,datetime from lxml import etree from dateutil.parser import parsedef str_to_unicode(s, encoding=None):return str(s, encoding) if encoding else str(s)def get_x…