题目描述
链表上有n个节点,编号从1到n,编号为i的节点指向编号为ki的节点,其中1 ≤ ki ≤ n和ki!=i,现在想问你,这个链表中是否存在一个三边形循环链表
输入描述:
一个数字n,表示有n个节点
接下来有n个数字,表示ki
输出描述:
若能形成三边形循环链表,则输出“YES”,否则输出“NO”
示例1
输入
5
2 4 5 1 3
输出
YES
说明
以1为头节点的链表可以形成一个三边形循环链表,1->2->4->1
#include<iostream>
typedef long long ll;
using namespace std;
int main()
{
ll n;
ll* k=new ll[n+1];
cin>>n;
int sign=0;
for(int i=1;i<=n;i++)
{
cin>>k[i];
}
for(int i=1;i<=n;i++)
{
if(i==k[k[k[i]]])
{
sign=1;
break;
}
}
if(sign)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
链表有关知识可看 C语言链表操作详解_顾十方的博客-CSDN博客_c语言 链表 <——链表有关知识可看
下面讲讲new
为什么有些地方不用new,有些地方又要new呢?
这就涉及到自动存储和动态存储了。
2.自动存储(自动变量、局部变量)
自动存储,也叫做自动变量,比如int num = 10; 这个num就属于自动变量。
所谓自动,代表它会自动申请内存,也会自动释放内存,自动变量是保存在栈里的(后进先出)。
如果大家觉得很难理解,那么,换一个名称——局部变量。
这个好理解了吧?局部变量在离开函数,或者离开它所属的代码块之后,就会被释放。
而Value v = Value(100); 、int num = 10; 这些都是局部变量,一旦离开函数或者离开它的作用域,就会被释放。
比如把int num; 作为成员变量,那么,在这个类被释放的时候,num变量也会被释放。
这就是为什么我们在创建了这么多int、float等基本类型的变量之后,不需要去释放它们。
因为它们是自动被释放的。
3.动态存储
自动变量有很大的好处,那就是不需要我们去管内存方面的事情,但是,有时候我们不希望有这样的自动释放内存。
我们希望自己去控制什么时候释放对象,这时候就要用到new了。
我们都知道,new了之后,如果不调用相应delete的话,申请到的内存空间是永远都不会被释放的。
这就是动态存储了,我们自己来申请内存,自己来释放内存。
当然,内存泄露的罪魁祸首之一也正是new~!
因为正常人都会有疏忽的时候,并且当程序足够庞大、逻辑足够复杂的时候,有些地方调用了new,却疏忽了delete是再正常不过了