快慢指针到底指向哪?

快慢指针到底指向哪?这个问题对于刚接触这种技巧的人来说往往把握不好.下面将以单链表为例, 说一点我个人的理解.

1) 比较通用的写法

		if (head == NULL || head->next == NULL)
			return true;

		ListNode *fast = head, *slow = head, *prev = NULL;

		while (fast && fast->next) {
			prev = slow;
			slow = slow->next;
			fast = fast->next->next;
		}</span>

while循环的结束条件分析:

fast == NULL                偶数(链表元素个数)               ******|s*****     slow指向后半部分的第一个元素

fast->next == NULL      奇数                                       *****|s|*****     slow指向正中位置

有时候需要指向第一个部分最后一个位置,比如分割链表. 这需要添加一个prev记录slow的前一个元素.有没有不需要加prev的呢?

我们可以对这种方法稍微变形.

2) 稍微的变形

		if (head == NULL || head->next == NULL)
			return true;
		ListNode *fast = head, *slow= head;
		while(fast->next && fast->next->next){
			slow = slow->next;
			fast = fast->next->next;
		}</span>

while循环的结束条件分析:

fast->next == NULL                   奇数                                  ****s|*|*****

fast->next->next == NULL         偶数                                 ****s|*****

slow总是指向第一部分的最后一个元素.

这种方法与第一种方法相比,在while循环中多探测了一个深度,因此提前一步结束循环.即slow指针少走了一步.

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-06 14:35:43

快慢指针到底指向哪?的相关文章

一文学会链表快慢指针解题技巧

前言 上文 我们详细地学习了链表的基本概念,优缺点,也带大家一步步由浅入深地学习了链表的翻转技巧,这一篇我们来看看链表的另一个解题技巧:快慢指针. 快慢指针在面试中出现的概率也很大,也是务必要掌握的一个要点,本文总结了市面上常见的快慢指针解题技巧,相信看完后此类问题能手到擒来.本文将详细讲述如何用快慢指针解决以下两大类问题 寻找/删除第 K 个结点 有关链表环问题的相关解法 寻找/删除第 K 个结点 小试牛刀之一 LeetCode 876:给定一个带有头结点 head 的非空单链表,返回链表的中

快慢指针原理--快速找到未知长度单链表的中间节点

package com.java.dataStruct; //节点类 public class Node<E> { E item; Node next; public Node(){ } public Node(E element){ this.item = element; } public Node(E element, Node next){ this.item = element; this.next = next; } } Node p1,r1; Node L1 = new Node

快慢指针及应用【转】

快慢指针中的快慢指的是移动的步长,即每次向前移动速度的快慢.例如可以让快指针每次沿链表向前移动2,慢指针每次向前移动1次. 判断单链表是否为循环链表 让快慢指针从链表头开始遍历,快指针向前移动两个位置,慢指针向前移动一个位置;如果快指针到达NULL,说明链表以NULL为结尾,不是循环链表.如果 快指针追上慢指针,则表示出现了循环. fast=slow=head; fast=fast->next->next; slow=slow->next; while(true){ if (fast==

C语言-指针到底是什么?

1.指针到底是什么?(1).指针变量与普通变量的区别 指针的实质就是一个变量,他跟普通变量没有任何本质区别.指针完整的名字应该叫做指针变量,简称为指针.2.为什么需要指针?(1).指针的出现是为了实现间接访问.在汇编中都有间接访问,其实就是CPU的寻址方式中的间接寻址.(2).间接访问(CPU的间接寻址)是CPU设计时决定的,这个决定了汇编语言必须能够实现间接寻址,又决定了    汇编之上的C语言也必须实现间接寻址.(3).高级语言Java/C#等没有指针,那么他们怎么实现间接访问?答案就是语言

单链表-快慢指针

快慢指针: 定义两个指针,一个快,一个慢,可以有多种用途.例如:快速找到位置长度单链表中的中间结点:对于循环链表中利用快慢指针也可以判断是否存在环. 快速找到位置长度单链表中的中间结点 1)使用一个指针,先索引一遍获取总长度,再取长度一半去循环获取到中间值:O(3L/2). 2)使用两个指针,快指针和慢指针,快指针一次向前走2格,慢指针一次走一格,当快指针走完全程,慢指针正好走在中间:O(L/2). 代码实现: //快速查找中间元素 int FindMidEle(LinkList L, Elem

常量指针和指向常量的指针

3种与const.指针及指针指向的对象有关的情形: 1.指向常量对象的指针 2.指向某个对象的常量指针 3.指向常量对象的常量指针 在第一种情况中,我们不能修改被指向的对象,但可以使指针指向其他对象: const char* pstring("Some text"); 在第二种情况中,我们不能修改指针中存储的地址,但可以修改指针指向的对象: char* const pstring("Some text"); 在最后一种情况中,指针和被指向的对象都被定义成常量,因此都

深入理解 [指针函数] 、[函数指针]、[指针的指针]、[指向指针数组的指针]

指针函数 1.指针函数是指带指针的函数,即本质是一个函数.当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需要指针或地址的表达式中. 函数返回类型是某一类型的指针: 格式: 类型标识符  *函数名(参数表) int *match(void *key_x,void *key_y); 解析:首先来说它是一个函数,只不过这个函数的返回值是一个地址值.函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针

快慢指针

//最快的方式查找一个链表中的最中间节点#include<stdio.h> #define SIZE 100000 typedef struct Node{ int data; struct Node* next; struct Node* prev; }Node; Node f[SIZE]; int index = 0; Node* head; Node* getnode(){ return &f[index++]; } void init(){ index = 0; head =

指针的类型和指针所指向的类型说明

指针的类型和指针所指向的类型说明 2010-03-17 15:24 1774人阅读 评论(1) 收藏 举报 编译器c 1.指针的类型 从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部 分就是这个指针的类型.这是指针本身所具有的类型.让我们看看例一中各 个指针的类型: (1)int*ptr;//指针的类型是int* (2)char*ptr;//指针的类型是char* (3)int**ptr;//指针的类型是int** (4)int(*ptr)[3];//指针的类型是int(*)[3]