链表中倒数第 k 个节点(双遍历、快慢指针)

链表中倒数第 k 个节点题目描述:输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。示例:给定一个链表: 1->2->3->4->5, 和 k = 2.返回链表 4->5.解题思路:在开始讲解题思路之前,我们先来回顾一下链表,因为作者数据结构是大二学的,有点忘了哈哈哈!链表
摘要由CSDN通过智能技术生成

链表中倒数第 k 个节点

题目描述:

输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。

示例:

给定一个链表: 1->2->3->4->5, 和 k = 2.

返回链表 4->5.

解题思路:

在开始讲解题思路之前,我们先来回顾一下链表,因为作者数据结构是大二学的,有点忘了哈哈哈!

链表

  • 链表是一系列的存储数据元素的单元通过指针串接起来形成的,因此每个单元至少有两个域,一个域用于数据元素的存储,另一个或两个域是指向其他单元的指针。这里具有一个数据域和多个指针域的存储单元通常称为节点(node)。

  • 链表的第一个节点和最后一个节点,分别称为链表的头节点和尾节点。尾节点的特征是其 next 引用为空(null)。链表中每个节点的 next 引用都相当于一个指针,指向另一个节点,借助这些 next 引用,我们可以从链表的头节点移动到尾节点。

  • 链表数据结构中主要包含单向链表、双向链表及循环链表。

因为我们今天主要用到单向链表,所以我就给大家具体讲讲单向链表吧!

单向链表

单向链表只有一个指针域,在整个节点中数据域用来存储数据元素,指针域用于指向下一个具有相同结构的节点。
在这里插入图片描述
单向链表中,每个节点的数据域都是通过一个 Object 类的对象引用来指向数据元素的,与数组类似,单向链表中的节点也具有一个线性次序,即如果节点 a1 的 next 引用指向节点 a2,则 a1 就是 a2 的直接前驱,a2 是 a1 的直接后续。只能通过前驱节点找到后续节点,而无法从后续节点找到前驱节点。

特点:

数据元素的存储对应的是不连续的存储空间,每个存储结点对应一个需要存储的数据元素。每个结点是由数据域和指针域组成。 元素之间的逻辑关系通过存储节点之间的链接关系反映出来。逻辑上相邻的节点物理上不必相邻。


在“链表中倒数第 k 个节点”这道题中,

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C语言,要输入一个链表输出倒数第K个节点,首先你需要创建一个链表结构,然后实现一个方法来遍历链表,找到倒数第K个节点。这里是一个简单的步骤说明: 1. **定义链表结构**: 假设链表节点定义如下: ```c typedef struct Node { int data; struct Node* next; } Node; ``` 2. **输入链表**: 创建一个函数来接收用户输入或已存在的链表节点,并构建链表: ```c void inputList(Node** head, int K) { Node* current = *head; int k = 0; // 输入节点数据和添加到链表 while (current != NULL) { // 用户输入或从已有的链表获取数据 // ... current = current->next; k++; } // 链表长度至少是K+1(因为从头开始计数) if (k < K) { printf("链表太短,无法找到倒数第K个节点"); return; } } ``` 3. **遍历链表找到倒数第K个节点**: 使用两个指针快慢指针,快指针每次前进两步,慢指针每次前进一步。当快指针到达链表尾部时,慢指针指向的就是倒数第K个节点: ```c Node* findKthFromEnd(Node* head, int K) { if (head == NULL) return NULL; Node* slow = head; Node* fast = head; for (int i = 0; i < K; i++) { fast = fast->next; } while (fast != NULL) { fast = fast->next; slow = slow->next; } return slow; } ``` 4. **输出倒数第K个节点**: 在`findKthFromEnd`函数返回后,打印出节点数据: ```c void printNode(Node* node) { printf("倒数第 %d 个节点的数据: %d\n", K, node->data); } int main() { Node* head = NULL; // 初始化链表头部 inputList(&head, K); // 输入链表 Node* kthNode = findKthFromEnd(head, K); if (kthNode != NULL) { printNode(kthNode); } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值