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

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日

相关文章

  • (转)-编写第一个ROS(创建工作空间workspace和功能包package)

    (转)-编写第一个ROS(创建工作空间workspace和功能包package) 介绍 在ROS中,工作空间(workspace)是存储ROS包(package)的顶层目录,一个功能包则被定义为一组相互依赖的节点和文件。在该教程中,我们将会学习如何创建一个ROS工作空间以及一个ROS功能包。 步骤 创建工作空间workspace 首先,我们需要创建一个工作空…

    其他 2023年3月28日
    00
  • 解决Android studio Error:(30, 31) 错误: 程序包 不存在的问题

    解决Android Studio中程序包不存在的问题攻略 当在Android Studio中遇到程序包不存在的错误时,可以按照以下步骤进行排查和解决: 检查依赖库的引用:首先,确保你的项目中正确引用了所需的依赖库。在项目的build.gradle文件中,检查dependencies部分是否包含了正确的依赖库引用。例如: groovy dependencies…

    other 2023年10月13日
    00
  • laravel5.5跨域问题解决方案

    当然,我很乐意为您提供有关“Laravel 5.5跨域问题解决方案”的完整攻略。以下是详细的步骤和两个示例: 1 跨域问题 跨域是指在浏览器中,当一个网页向不同的域名、端口或协议发送请求时,浏览器会阻止该请求。这是由于浏览器的同源策略所导致的。 2 Laravel 5.5跨域问题解决方案 Laravel 5.5提供了一种简单的方法来解决跨域问题。以下是解决跨…

    other 2023年5月6日
    00
  • C语言例题讲解指针与数组

    C语言例题讲解指针与数组 本文将通过两个实例,详细讲解指针与数组在C语言中的应用。 实例一:指针与数组的使用 在C语言中,可以通过指针来操作数组,以下是一个简单的示例。 #include <stdio.h> int main() { int arr[5] = {1, 2, 3, 4, 5}; int *p = arr; // 指针指向数组的首地址…

    other 2023年6月25日
    00
  • elasticsearch中国

    当然,我很乐意为您提供有关“elasticsearch中国”的完整攻略。以下是详细的步骤和两个示例: 1. 什么是elasticsearch中国? elasticsearch中国是elasticsearch在中国的官方网站,提供了elasticsearch的中文文档、社区、培训、咨询等服务。elasticsearch是一个开源的分布式搜索引擎,可以用于全文搜…

    other 2023年5月6日
    00
  • Go语言学习函数+结构体+方法+接口

    Go语言学习函数+结构体+方法+接口 函数 函数是Go语言中的一等公民,可以像普通变量一样被传递、赋值和使用。函数的定义方式如下: func 函数名(参数列表) (返回值列表) { //函数体 } 其中,参数列表和返回值列表可以为空。 示例代码: package main import "fmt" func add(a, b int) i…

    other 2023年6月27日
    00
  • ios8固件下载 苹果iOS8 Beta测试版固件下载大全

    iOS 8固件下载攻略 苹果iOS 8是一个备受期待的操作系统版本,它带来了许多新功能和改进。如果你想尝试iOS 8的Beta测试版固件,下面是一个详细的攻略,教你如何下载iOS 8固件。 步骤一:注册为苹果开发者 要下载iOS 8的Beta测试版固件,你需要先注册为苹果开发者。以下是注册的步骤: 访问苹果开发者网站。 点击\”加入Apple开发者计划\”按…

    other 2023年8月4日
    00
  • 详解Android GLide图片加载常用几种方法

    详解Android Glide图片加载常用几种方法 什么是Glide Glide是一个流行的Android图片加载库,可用于加载网络图片、本地文件和资源,支持GIF、Webp和缩略图等特性,自适应大小和缓存策略,而且易于使用。其特点有: 占用磁盘缓存空间少,避免浪费 加载速度快,渲染效果好 生命周期自动管理,避免内存泄漏和OOM 支持网络图片、本地文件和资源…

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