C语言快慢指针

本文详细介绍了C语言中快慢指针的概念及其在链表操作中的应用,包括如何通过快慢指针找到链表的中间节点,检查链表是否有环,以及在解决其他数据结构问题中的作用。通过实例代码和步骤解析,帮助读者深入理解快慢指针的工作原理。
#include <stdio.h>
#include <stdlib.h>
#include<time.h>/*用到了time函数,所以要有这个头文件*/
#define FALSE 0
#define TRUE 1
typedef int Status;
typedef int ElemType;

typedef struct Node
{
    ElemType data;// 数据域
    struct Node
### 概念 快慢指针是一种常见的算法技巧,通常定义出两个指针并以不同的速度遍历链表。一般情况下,慢指针每次移动一个节点,指针每次移动两个节点。使用此方法可以解决一些链表中的问题,并且提高了代码效率,简化了时间复杂度[^1]。 ### 使用方法 在C语言中,快慢指针的使用通常遵循以下步骤: 1. 定义两个指针,分别作为指针和慢指针,初始时都指向链表的头节点。 2. 根据具体问题,确定指针和慢指针的移动规则,一般指针移动速度比慢指针。 3. 在循环中移动指针,直到满足特定条件。 ### 应用场景 #### 寻找特殊节点 可以利用快慢指针寻找链表的中间节点。指针每次移动两个节点,慢指针每次移动一个节点,当指针到达链表末尾时,慢指针正好指向链表的中间节点。示例代码如下: ```c #include <stdio.h> #include <stdlib.h> // 定义链表节点结构 typedef struct ListNode { int val; struct ListNode *next; } ListNode; // 寻找链表中间节点 ListNode* findMiddle(ListNode* head) { ListNode* fast = head; ListNode* slow = head; while (fast && fast->next) { fast = fast->next->next; slow = slow->next; } return slow; } // 创建链表节点 ListNode* createNode(int val) { ListNode* newNode = (ListNode*)malloc(sizeof(ListNode)); newNode->val = val; newNode->next = NULL; return newNode; } int main() { // 创建链表 1->2->3->4->5 ListNode* head = createNode(1); head->next = createNode(2); head->next->next = createNode(3); head->next->next->next = createNode(4); head->next->next->next->next = createNode(5); ListNode* middle = findMiddle(head); if (middle) { printf("Middle node value: %d\n", middle->val); } return 0; } ``` #### 寻找倒数第k个节点 输入一个链表,输出该链表中倒数第k个结点。可以先让指针移动k步,然后快慢指针同时移动,当指针到达链表末尾时,慢指针正好指向倒数第k个节点。示例代码如下: ```c #include <stdio.h> #include <stdlib.h> // 定义链表节点结构 typedef struct ListNode { int val; struct ListNode *next; } ListNode; // 寻找倒数第k个节点 ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) { ListNode* fast, * slow; fast = slow = pListHead; while (k--) { if (fast) { fast = fast->next; } else { return NULL; } } while (fast) { slow = slow->next; fast = fast->next; } return slow; } // 创建链表节点 ListNode* createNode(int val) { ListNode* newNode = (ListNode*)malloc(sizeof(ListNode)); newNode->val = val; newNode->next = NULL; return newNode; } int main() { // 创建链表 1->2->3->4->5 ListNode* head = createNode(1); head->next = createNode(2); head->next->next = createNode(3); head->next->next->next = createNode(4); head->next->next->next->next = createNode(5); ListNode* kth = FindKthToTail(head, 2); if (kth) { printf("Kth node from tail value: %d\n", kth->val); } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值