首页 > 其他分享 >代码随想录day 6|指针总结

代码随想录day 6|指针总结

时间:2023-03-11 22:55:05浏览次数:58  
标签:slow 随想录 fast day 链表 index1 节点 指针

环形链表

题目链接:142、环形链表Ⅱ
题目描述:给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

为了表示给定链表中的环,使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。

输入:head = [3,2,0,-4], pos = 1
输出:返回索引为 1 的链表节点
解释:链表中有一个环,其尾部连接到第二个节点。

思考

  • 本题不仅考查对链表的操作,而且还需要一些数学运算
  • 判断链表是否有环
  • 如果有环,这么找到这个环的入口

那么怎么判断链表是否有环呢?

  1. 使用快慢指针法,都从头节点出发
  2. 快指针走两步(很重要),慢指针走一步
  3. 如果在走的过程中,快慢指针相遇,则证明有环
    (可看成slow不动,fast快指针一步一步追赶slow)
    如动图所示:

如果有环,如何找到这个环的入口

假设从头结点到环形入口节点 的节点数为x。 环形入口节点到 fast指针与slow指针相遇节点 节点数为y。 从相遇节点 再到环形入口节点节点数为 z。 如图所示:

接下来用数学思想来解题:
满指针slow走了有x+y,快指针fast走了x+n*(y+z),因为快指针可能不止走了一圈而是走了好多圈为了等慢指针。

因为fast指针是一步走两个节点,slow指针一步走一个节点, 所以 fast指针走过的节点数 = slow指针走过的节点数 * 2:
(x + y) * 2 = x + y + n (y + z);
x + y = n (y + z);
x = n (y + z) - y;
x = (n - 1) (y + z) + z;(n一定>=1)

代码如下

//环形链表。如何判断环形链表?怎么找到入口?疑难点?
 class Solution {
public:
    ListNode *detectCycle(ListNode *head){
	fast = head;
	slow = head;
	while(fast != null && fast->next!=null){
		//fast快指针是两步一跳,而慢指针走一步,不用判断慢为null
		fast = fast->next->next;
		slow = solw->next; 
		if( fast == slow){
			//fast与slow相遇,说明找到了环
			index1 = fast;
			index2 = head;//index1是相遇的点。index2是从头部出发 
			while(index1 != index2){
				index1 = index1->next;//
				index2 = index2->next;//直到index1和2再次相遇终止循环 
			} 
		return index1;//返回环的入口	
		}
		 
	}
	return null;	
	}
	}

链表总结篇

  • 链表的种类主要为:单链表,双链表,循环链表
  • 链表的存储方式:链表的节点在内存中是分散存储的,通过指针连在一起。
  • 链表是如何进行增删改查的。
  • 数组和链表在不同场景下的性能分析。
    可以说把链表基础的知识都概括了,但又不像教科书那样的繁琐。

数组的经典题目

虚拟头结点
203.移除链表元素-简单

链表的基本操作
707.设计链表-中等

反转链表
206.反转链表-简单
交换链表中的节点
24. 两两交换链表中的节点-中等
链表相交
面试题 02.07. 链表相交-简单

删除链表的的倒数第N个节点
19.删除链表的的倒数第N个节点-中等

环形链表
142、环形链表Ⅱ-中等

标签:slow,随想录,fast,day,链表,index1,节点,指针
From: https://www.cnblogs.com/lijian-allan/p/17177240.html

相关文章

  • day11 (2023.3.11)
    1.String字符串12.String字符串2 运行结果: 3.内部类 测试类和运行结果: 4.静态内部类和运行结果: 5.匿名内部类和局部内部类 面向对象基本完结。da......
  • day12
    用户交互界面两种输入方法next()输入法packagecom.xiao.scanner;importjava.util.Scanner;publicclassDemo01{publicstaticvoidmain(String[]args){......
  • day11
    包机制packagecom.xiao.operator;importcom.xiao.base.*//*导入所有类importjava.util.Date;publicclassDemo05{publicstaticvoidmain(String[]......
  • 指针类型的意义
    调试可以看出不论是声明类型的指针变量,他的字节大小都是8个字节(在32位平台上是4个字节,在64位平台是8个字节),在大小上,指针类型没有任何区别。TIP:一个十六进制位==4个二进制位......
  • 双指针技巧数组题目
    题目难度要点删除有序数组中的重复项●快指针与慢指针值不同,那么应该将值放在慢指针下一位移除元素●快指针对应值若不需移除,那么应该将值放在当前慢指针......
  • 代码随想录11天逆波兰表达式求值
    150. 逆波兰表达式求值给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。请你计算该表达式。返回一个表示表达式值的整数。注意:有效的算......
  • 安全编码案例(52)go结构体方法未使用指针,结构体实例的锁失效
    摘要:go结构体方法未使用指针,结构体实例的锁失效【问题描述】go结构体方法未使用指针,结构体实例的锁失效【错误代码片段】给结构体定义一把锁在函数中调用锁实测锁......
  • Day05-Vue脚手架
    Vue脚手架学习目标:理解Node.js基本使用方法理解包资源管理器NPM的使用理解webpack的作用理解vue-cli脚手架(重点)Element-UI组件库1.vue的格式: newVue({......
  • Day06-Tomcat服务器&Servlet入门
    今日目标1.web知识概述2.tomcat【重点】3.创建servlet xml anno(注解) 4.servlet执行原理5.servlet生命周期6.servlet体系结构1.web相关知识概述【了解】1......
  • Day06-maven的web工程
    maven的web工程创建步骤:1.创建普通的maven工程​ 参考:略2.打成war包​ 说明:普通工程打成jar包。web工程打war包。在pom.xml中书写如下内容:3.在普通的maven工程上生......