三边形链表(new的使用)

27 阅读4分钟
题目描述 
链表上有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是再正常不过了