C语言实现输出链表中倒数第k个节点

yizhihongxing

C语言实现输出链表中倒数第k个节点

题目描述

给定一个链表,要求实现一个函数输出该链表中倒数第k个节点。

解题思路

这道题可以通过两个指针来解决:一个指针先走k-1步,然后两个指针一起走,直到先走的指针到达链表的末尾。此时,后一个指针指向的就是链表中倒数第k个节点。

具体实现过程如下:

  1. 定义两个指针 p1p2,同时指向链表的头结点。
  2. p1 指针先走 k-1 步,即向后移动 k-1 个节点 。
  3. 接着,让 p1p2 两个指针同时向后移动,直到 p1 指向链表的尾节点为止。
  4. 此时, p2 指向的节点就是链表中倒数第k个节点。

代码实现

下面是完整代码实现:

#include <stdio.h>
#include <stdlib.h>

// 定义链表节点结构体
struct ListNode {
    int val;
    struct ListNode *next;
};

struct ListNode* getKthFromEnd(struct ListNode* head, int k){
    if (!head) return NULL;

    struct ListNode *p1 = head, *p2 = head;

    // 让p1指针先走k-1步
    for (int i = 0; i < k - 1; i++) {
        if (p1) p1 = p1->next;
        else return NULL;
    }

    // 同时移动p1和p2指针
    while (p1->next) {
        p1 = p1->next;
        p2 = p2->next;
    }

    return p2;
}

int main() {
    // 创建一个链表
    struct ListNode *head = (struct ListNode*)malloc(sizeof(struct ListNode));
    head->val = 1;
    head->next = NULL;

    struct ListNode *p = head;

    for (int i = 2; i <= 5; i++) {
        struct ListNode *node = (struct ListNode*)malloc(sizeof(struct ListNode));
        node->val = i;
        node->next = NULL;
        p->next = node;
        p = p->next;
    }

    // 测试输出倒数第3个节点
    struct ListNode *res = getKthFromEnd(head, 3);

    if (res) printf("%d",res->val);

    return 0;
}

示例说明

我们将上述代码放入到C语言编译器(例如Dev-C++)中进行编译运行,得到输出结果为3。

再举一个实际一点的例子:比如我们有一条链表 1->2->3->4->5,想要输出倒数第2个节点,那么我们调用函数 getKthFromEnd(head, 2),输出结果为4。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言实现输出链表中倒数第k个节点 - Python技术站

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

相关文章

  • C++-操作符重载、并实现复数类详解

    C++-操作符重载、并实现复数类详解 什么是操作符重载 操作符重载是指允许用户自定义操作符所代表的行为,以及对于自定义类型的操作符操作。在C++中,操作符是一种独立于函数之外的特殊函数。 为什么需要操作符重载 操作符重载可以让程序更加简洁、易读。举例来说,C++中可以使用”+”操作符来进行两个整数的加法运算。但如果我们想要把两个自定义类型的对象相加,就需要进…

    other 2023年6月26日
    00
  • Android 调用百度地图API示例

    Android 调用百度地图API示例攻略 步骤一:获取百度地图API密钥 在开始之前,您需要先获取百度地图API密钥。请按照以下步骤进行操作: 访问百度地图开放平台(http://lbsyun.baidu.com/)。 注册一个新的开发者账号,或者使用已有的账号登录。 创建一个新的应用,填写应用名称和包名等信息。 在应用详情页面,找到并复制您的API密钥。…

    other 2023年9月7日
    00
  • Python中动态获取对象的属性和方法的教程

    Python中动态获取对象的属性和方法的教程 在Python中,我们可以使用一些内置函数和特殊方法来动态获取对象的属性和方法。这对于编写通用代码、探索未知对象的特性以及进行反射等任务非常有用。 1. 获取对象的属性 我们可以使用内置函数dir()来获取对象的属性列表。它返回一个包含对象所有属性名称的列表。 示例1:获取对象的属性列表 class Person…

    other 2023年6月28日
    00
  • java-将intwritatble转换为int

    在Hadoop MapReduce中,IntWritable是一种常用的数据类型,它表示一个整数。有时候,我们需要将IntWritable转换为Java中的int类型。本文将介绍如何将IntWritable转换int类型提供两个示例说明。 示例一:使用IntWritable的get方法 IntWritable类提供了一个get()方法,可以将IntWrita…

    other 2023年5月9日
    00
  • 逃离塔科夫下载慢怎么办 下载速度慢解决方法

    针对“逃离塔科夫下载慢怎么办 下载速度慢解决方法”的问题,我提供以下完整攻略。 1. 确认原因 首先需要确认逃离塔科夫下载速度慢的原因,可能是以下几点: 网络问题:网络不稳定或者网速不够快 服务器问题:逃离塔科夫官方服务器带宽负载过重,导致下载速度变慢 客户端问题:逃离塔科夫客户端设置不当或有其他问题,导致下载速度变慢 2. 方案一:尝试更改下载源 如果网络…

    other 2023年6月27日
    00
  • MySQL所支持的数据类型与表字段约束类型的学习教程

    MySQL支持的数据类型与表字段约束类型学习教程 数据类型 MySQL支持多种数据类型,包括数值类型、字符串类型、日期与时间类型、二进制类型以及其他特殊类型。常用的数据类型包括: 数值类型 TINYINT:占据1个字节,取值范围是从-128到127,对于存储小范围数字很有用 SMALLINT:占据2个字节的空间,取值范围是从-32768到32767 INT:…

    other 2023年6月25日
    00
  • python绘图技巧

    Python绘图技巧 Python是一种强大的编程语言,其生态系统完善,拥有许多绘图库,可用于创建各种类型的图表,包括折线图、饼图、直方图和散点图等。本篇文章将为您介绍如何使用Python绘制图形,包括以下技巧: Matplotlib Matplotlib是Python中最流行的图形库之一。该库提供了各种绘图类型和配置选项,由于它对Python的支持非常广泛…

    其他 2023年3月28日
    00
  • 剑侠情缘手游装备强化玩法详细介绍

    剑侠情缘手游装备强化玩法详细介绍 强化概述 剑侠情缘手游中,装备强化是提高装备属性的主要途径之一。强化可以提高装备的基础属性,比如攻击力、防御力等,并且还有概率会出现额外属性,比如攻击力加成、暴击等。强化等级越高,装备属性提升越多,但强化失败会降低装备属性。 强化流程 打开游戏,进入角色界面,选择需要强化的装备。 点击装备右下角的强化按钮,进入强化界面。此时…

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