代码详解:这里使用快(一次移动两个节点)慢(一次移动一个节点)指针的办法解决,如果链表有环那么快指针和慢指针一定会相遇 ,如果没有环那么快指针会移动到NULL节点,这时结束并返回false
class Solution {
public:
bool hasCycle(ListNode *head) {
ListNode*fast=head;//定义快慢指针
ListNode*slow=head;
while(fast&&fast->next)//快指针当前和下一个节点都存在时,即只要快指针可以移动两步就让快指针移动
{
slow=slow->next;//慢指针移动一步
fast=fast->next->next;//快指针移动两步
if(slow==fast)
{
return true;//相遇说明有环
}
}
return false;//如果走到结尾都没有相遇则没有环
}
};
面经:
- 解释以下空指针和野指针,并说明如何解决这些问题
(1)野指针:指向被释放的内存或者访问受限的指针,可能是因为指针未被初始化,被释放的指针没有被置为NULL,指针越界操作导致。
解决办法:
- 始终初始化指针。
- 在释放内存后立即将指针设置为NULL,避免它成为野指针。
- 在使用指针之前检查其是否为NULL。
- 使用智能指针(如C++中的std::unique_ptr或std::shared_ptr)自动管理内存
(2)空指针是一个没有被初始化的指针,它不指向任何有效的内存地址。在C/C++中,通常使用NULL(在C++11标准之后推荐使用nullptr)来表示空指针。
解决办法:
- 在声明指针后立即初始化为NULL或nullptr。
- 在使用指针之前检查是否为NULL或nullptr。
2. c/c++内存分区
- 内存分配方式:在C++中内存分为5个区,分别是堆、栈、自由存储区、全局/静态存储区、常量存储区。
- 栈:在执行程序过程中,局部作用域出现的一些局部变量可以在栈上创建,等脱离该作用域创建的内存被释放。栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。
- 堆:用于程序内存动态分配,用c/c++中的new/malloc分配,delete/free 释放。堆则是 C/C++函数库提供的,它的机制是很复杂的。
- 自由存储区:它是C++基于new 操作符的一个概念,凡是通过new 操作符申请的内存即为自由存储区
- 全局/静态存储区:这块内存在程序编译期间已经分配好,在程序整个运行阶段一直存在。全局变量个和静态变量
- 常量存储区:特殊的一块内存,里面存放的是常量,不允许修改
标签:存储,fast,第八天,C++,冲刺,内存,实习,NULL,指针 From: https://blog.csdn.net/m0_74381802/article/details/143376582