C++进阶练习删除链表的倒数第N个结点详解

C++进阶练习删除链表的倒数第N个结点详解

问题描述

给定一个单向链表的头指针和一个整数 n,要求删除这个链表的倒数第 n 个节点。例如,链表为 1→2→3→4→5,n = 2 时,删除倒数第二个节点后的链表为 1→2→3→5。

解法思路

先让一个指针指向链表头节点,再让另一个指针从头节点开始向后移动 n-1 步,此时两个指针之间有 n-1 个节点。然后同时向后移动两个指针,直到第二个指针指向 NULL,此时第一个指针指向的节点就是倒数第 n 个节点。

我们可以设置一个哑节点 dummy,令其next指针指向head,然后设置两个指针p和q,一开始都指向哑节点。先将q指针向后移动n个节点,然后p和q同时后移,直到q指向最后一个节点时停止,那么此时p指向的节点就是要删除的节点的前一个节点。

代码实现

struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

ListNode* removeNthFromEnd(ListNode* head, int n) {
    ListNode* dummy = new ListNode(0);
    dummy->next = head;
    ListNode* p = dummy;
    ListNode* q = dummy;

    for (int i = 0; i < n; i++) {
        q = q->next;
    }

    while (q->next != NULL) {
        p = p->next;
        q = q->next;
    }

    ListNode* temp = p->next;
    p->next = p->next->next;
    delete temp;

    return dummy->next;
}

示例说明

示例1

输入:

1->2->3->4->5, n = 2

输出:

1->2->3->5

解释:

删除链表的倒数第二个节点(结点值为4),输出链表为1->2->3->5。

示例2

输入:

1->2->3->4->5, n = 5

输出:

2->3->4->5

解释:

删除链表的倒数第五个节点(结点值为1),输出链表为2->3->4->5。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++进阶练习删除链表的倒数第N个结点详解 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 使用postman进行并发测试

    当需要测试Web应用程序的性能时,使用Postman进行并发测试是一种有效的方法。以下是使用Postman进行并发测试的完攻略: 步骤1:安装Postman 首先,您需要下载并安装Postman。您可以从Postman官方网站(https://.postman.com/downloads/)下载并安装Postman。 步骤2:创建测试集合 在Postman中…

    other 2023年5月6日
    00
  • 在Linux命令行中创建和展示幻灯片的教程

    下面是在Linux命令行中创建和展示幻灯片的详细攻略。 安装软件 首先需要安装libreoffice软件来创建幻灯片,可以通过以下命令进行安装: sudo apt-get update sudo apt-get install libreoffice 创建幻灯片 使用libreoffice命令可以启动软件,进入图形化界面创建幻灯片,然而在命令行中输入libr…

    other 2023年6月26日
    00
  • 华为Mate30怎么查看剩余内存?华为Mate30剩余可用空间查询教程

    华为Mate30剩余内存查询攻略 华为Mate30是一款功能强大的智能手机,它提供了多种方法来查看剩余内存和可用空间。下面是详细的攻略,包含了两个示例说明。 方法一:通过设置菜单查看剩余内存 打开华为Mate30的主屏幕,向上滑动手指,进入应用列表。 找到并点击“设置”图标,进入设置菜单。 在设置菜单中,向下滑动并点击“存储”选项。 在存储页面中,您将看到设…

    other 2023年8月1日
    00
  • windowsserver2012安装密钥

    Windows Server 2012安装密钥 Windows Server 2012是一款由微软开发的服务器操作系统,它具有高效性、易用性和稳定性的特点,广泛应用于企业和机构的服务器管理和数据处理。但是,在安装Windows Server 2012的过程中,可能会遇到需要输入安装密钥的情况。本文将介绍如何获取和使用Windows Server 2012的安…

    其他 2023年3月29日
    00
  • 使用AngularJS对路由进行安全性处理的方法

    使用AngularJS对路由进行安全性处理的方法 在AngularJS中,可以使用路由来控制应用程序的导航和页面加载。为了确保应用程序的安全性,我们可以对路由进行安全性处理。下面是一些方法来实现这一目标。 1. 使用路由守卫 路由守卫是AngularJS提供的一种机制,用于在路由导航之前和之后执行一些操作。我们可以使用路由守卫来检查用户是否有权限访问某个路由…

    other 2023年7月29日
    00
  • C语言将日期、时间保存到文本文件中的方法

    C语言将日期、时间保存到文本文件中的方法主要有以下几个步骤: 包含头文件 在C语言程序中,首先需要包含头文件,该头文件中包含了与日期、时间相关的函数。 #include <time.h> 获取当前时间 使用time函数获取当前时间,time函数返回自1970年1月1日零时起经过的秒数。可以使用localtime函数将时间秒数转换为具体的日期时间。…

    other 2023年6月26日
    00
  • 西门子S7系列以太网通讯处理器安装调式操作

    西门子S7系列以太网通讯处理器是一种常用的工业自动化设备,它可以通过以太网与其他设备进行通讯。在本文中,我们将详细介绍S7系列以太网通讯处理器的安装、调试和操作方法,并提供两个示例说明。 安装S7系列以太网通讯处理器 步骤1:准备工作 在安装S7系列以太网通讯处理器之前,我们需要准备好以下工具和材料: S7系列以太网通讯处理器 以太网网线 电源线 电脑 步骤…

    other 2023年5月5日
    00
  • Java实现UDP通信过程实例分析【服务器端与客户端】

    Java实现UDP通信过程实例分析【服务器端与客户端】 本文将详细介绍如何使用Java语言实现UDP(用户数据报协议)通信,其中包含了服务器端与客户端的实现过程。UDP是一种无连接的传输协议,相较于传输控制协议TCP而言,UDP具备更高的传输速度,但是它不保证消息的可靠性,容易造成消息的丢失和乱序等问题,因此仅在特定场合使用。 1. TCP和UDP协议的区别…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部