当前位置: 首页 > news >正文

【数据结构】快指针和慢指针

一、

给你单链表的头结点 head ,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。
要求:只遍历一遍链表

可以使用快慢指针:fast 一次走两步,slow 一次走一步。当 fast == NULL(偶数个结点)或者 fast->next == NULL(奇数个结点)就停止,返回 slow。

struct ListNode* middleNode(struct ListNode* head) 
{struct ListNode* slow, *fast; slow = fast = head; while(fast && fast->next){slow = slow->next; fast = fast->next->next;}return slow;
}

注意:

1、一次性定义多个指针时,第二个及以后的指针名前面都要加 * 。

2、while( )括号内是循环继续的条件。

二、

输入一个链表,输出该链表中倒数第k个结点。
要求:只遍历一遍链表

快慢指针:fast 先走 k - 1 步,然后 fast 和 sliow 同时走,直到 fast 走到链表的最后一个结点。

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) 
{struct ListNode* slow, *fast; slow = fast = pListHead;while(--k){fast = fast->next;}while(fast->next){slow = slow->next; fast = fast->next;}
}

三、

给你一个链表的头节点 head ,判断链表中是否有环。

使用快慢指针:fast 一次走两步,slow 一次走一步。

bool hasCycle(struct ListNode *head) 
{   if(head == NULL)return false;if(head->next == NULL)return false;struct ListNode * slow = head;struct ListNode * fast = head;while(1){fast = fast->next;if(fast == slow)return true;if(fast == NULL)return false;fast = fast->next;if(fast == slow)return true;if(fast == NULL)return false;slow = slow->next;if(fast == slow)return true;if(slow == NULL)return false;}return false;
}


http://www.mrgr.cn/news/92096.html

相关文章:

  • 第1章:LangChain4j的聊天与语言模型
  • Orange 单体架构 - 快速启动
  • 什么是向量化?ElasticSearch如何存储向量?
  • Python爬虫-破解字体加密技术
  • STM32基础篇(二)------GPIO
  • 前端面试真题 2025最新版
  • DeepSeek入门到大师 清华大学[1-5版]全集
  • go执行java -jar 完成DSA私钥解析并签名
  • Java GC 基础知识快速回顾
  • 【数据结构】(12) 反射、枚举、lambda 表达式
  • 游戏引擎学习第119天
  • SOME/IP--协议英文原文讲解11
  • 简单又强大的Zustand,为啥不自己手写一个呢
  • 虚拟机emulator报错
  • C# 将非托管Dll嵌入exe中(一种实现方法)
  • Windows10系统本地部署Ollama_DeepSeek-R1实操手册
  • leetcode 119. 杨辉三角 II
  • 【数据结构】(11) Map 和 Set
  • 洛谷P1135多题解
  • vue3 Props的使用