判断单链表中是否存在回环

2023-05-16

判断单链表是否存在回环原理很简单,即假设有两个指针p1,p2。在每次循环的时候,p1先走一步,p2走两步,直到p2碰到空指针或两者相等时循环结束,如果两个指针相等则说明存在回环。

具体代码如下:(仅供参考)

#include <iostream>
using namespace std;

#include <stdio.h>

struct Node
{
	int data;
	Node *next;
};

Node *create()
{
	Node *head;
	int data=0;
	int i=0,j=0;
	Node *New;
	Node *q;
	head=(Node*)malloc(sizeof(Node));
	while(1)
	{
		cout<<"input the "<<(++i)<<"th "<<"data: ";
		cin>>data;
		
		if(data==0)
		{
			break;
		}

		New=(Node *)malloc(sizeof(Node));
		New->data=data;
	
		if(++j==1)
		{
			head->next=New;
		}
		else
		{
			q->next=New;
		}
		q=New;
	
	}
	New->next=NULL;
	return head;
}

int length(Node *head)
{
	Node *p;
	int len=0;

	p=head->next;
	if(head->next==NULL)
		return 0;
	while(p!=NULL)
	{
		len++;
		p=p->next;
	}
	return len;
}

void print(Node *head)
{
	Node *p=head ;
	int i=0;
	if(head->next==NULL)
		return ;

	while(p->next!=NULL)
	{	
		p=p->next;
		cout<<"The "<<++i<<"th data is: "<<p->data<<endl;
	
	}
	cout<<endl;

}

//判断是否存在回环
//如果存在,start存放回环开始节点
bool IsLoopList(Node *head,Node **start)
{
	Node *p1=head,*p2=head;
	if(head==NULL && head->next==NULL)
	{
		return false;
	}

	do
	{
		p1=p1->next;	//p1走一步
		p2=p2->next->next;//p2走两步

	}while(p2 && p2->next && p1!=p2);

		if(p1==p2)
		{
			*start=p1;//p1为回环开始节点
			return true;

		}
		else 
			return false;
}





int main()
{
	Node *head;
	head=create();
	print(head);
	cout<<"The length of List is: "<<length(head)<<endl;
	
	bool IsLoop=false;
	Node *start=head->next->next->next->next;//使第四个节点为回环开始位置
	start->next=head->next;//回环连接到第二个节点

	Node *loopStart=NULL;
	IsLoop=IsLoopList(head,&loopStart);
	cout<<"IsLoop="<<IsLoop<<endl;
	cout<<"IsbLoop==loopStart? "<<(loopStart==start)<<endl<<endl;

	return 0;

}


在上面主函数的情况下,手动设置了第四个节点为回环的开始位置,并将回环爱你接到第二个节点。最后的输出均为1,表明存在回环。

运行结果如下:



将主函数中

start->next=head->next;//回环连接到第二个节点
注释掉的话,,最后的输出结果均为0,表明不存在回环。输出结果如下:









本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

判断单链表中是否存在回环 的相关文章

  • UI

    一 布局文件中控件 TextView xff1a focusableInTouchMode 61 34 true 34 滚动 EditText xff1a hint 输入提示的文本 xff1a inputType 输入文本类型 maxLin
  • AlertDialog 、Notification

    AlertDialog 对话框可根据具体的选用不同的方法 如单项对话框则有 builder setSingleChoiceItems 单项选择 builder setMultiChoiceItems 多项选择 Notification Al
  • SAP 一句话入门之SD

    SD是Sales and Distribution的简称 在SAP系统中 xff0c 销售与分销模块处在供应链下游 xff0c 关注从客户订单到向客户收款的全过程 SD模块中的Sales好理解 xff0c 而Distribution却容易被
  • Animator --属性动画

    属性动画Animator 传统动画 Animation 传统动画 xff1a eg 平移 TranslateAnimation animation 61 new TA 0 200 0 0 参数 xff1a 初始 最终 的 X Y坐标 ani
  • 异步消息处理机制--线程

    多线程编程 执行一条耗时操作 xff0c 需放在子线程里运行 1 线程的基本用法 新建类继承 或实现接口 xff0c 重写方法 xff08 可直接内部类 xff09 class MyThread extends Thread run 处理具
  • 自定义适配器--ListView数据源的绑定

    ListView 利用自定义的适配器 xff0c 使用缓存机制优化 首先 xff0c ListView完整写法的三个步骤 xff1a 1 初始化数据源 2 定义适配器 3 加载适配器 一 数据源 1 定义数组保存已经准备好的数据源 2 定义
  • ViewPager + Fragment 仿微信滑动切换页卡

    1 新建类 xff0c 继承Fragment 导入的是v4的包 xff08 向下兼容 xff09 xff0c 利用布局加载器将其与xml结合起来 public class FragmentAddress extends Fragment 6
  • Android Studio 一些实用的快捷键

    Alt 43 Enter 自动导入提示 Ctrl 43 点击关键字 查看源码 Ctrl 43 tab 切换代码窗口 Ctrl 43 P 显示方法参数 Ctrl 43 Alt 43 t 弹出包围结构 xff08 if xff09 Ctrl 4
  • View、自定义View

    view绘制 1 控件架构 ViewGroup作为 父控件 xff0c 可包含多个View控件 xff0c 形成控件树 上层控件负责下层子控件的测量与绘制 xff0c 并传递交互事件 2 View的测量 绘制前提 96 96 96 onMe
  • 标题栏与水平滑动界面:TabLayout、ViewPager、Fragment;;引导页:ViewPager+View

    一 1 布局中添加TabLayout 控件 xff0c 需要添加依赖 xff1b 使用相关的属性 xff0c 需要定义命名空间 compile 39 com android support design 25 0 1 39 在app下的bu
  • SharedPerference

    1 定义前的考虑 1 xff09 定义存取方式 get put 2 xff09 明确数据类型 Int String Boolean 3 定义删除功能 单个 全部 2 实现步骤 public class SharedUtil public s
  • 圆形头像CircleImageView

    头像图片来源 照相机 相册 xff1b 利用弹出的dialog进行选择 1 添加依赖包 xff0c 添加控件 xff0c 相关属性 在app下的 build gradle 中添加 xff1a compile 39 de hdodenhof
  • RxVolley进行网络请求(get方式),获取json数据

    RxVolley 是一个基于 Volley的网络请求库 项目地址 xff1a https github com kymjs RxVolley 1 添加依赖 xff1a compile 39 com kymjs rxvolley rxvoll
  • SAP 寻找增强点的方法

    SAP中寻找增强的实现方法 SAP 增强已经发展过几代了 xff0c 可参考 SAP 标准教材 BC425 和 BC427 简单的说SAP的用户出口总共有四 代 1 第一代 基于源代码的增强 SAP提供一个空代码的子过程 xff0c 在这个
  • Sublime_text2快捷键

    1 Ctrl 43 Enter 在下一行输入 xff08 添加新的下一行 xff09 2 Ctrl 43 Shift 在上一行输入 xff08 添加新的上一行 xff09 3 Ctrl 43 L 选择当前行 4 Ctrl 43 K 43 B
  • jQuery基础

    1 应用jQuery库 xff1a lt script src 61 34 路径 名称 js 34 gt lt script gt 导入 外链式css样式 xff1a lt link rel 61 34 stylesheet 34 href
  • javaScript基础

    一 浏览器对象 1 window对象 xff1a 指当前的浏览器窗口 方法 xff1a 2 定 时器 xff1a 可设定一个时间之后 xff0c 再来运行 var timer 61 setInterval function 做的事情 xff
  • JavaScript深入浅出(进阶)

    1 数据类型 js是弱类型 xff0c 定义变量时不需要指定具体的数据类型 xff0c 因此会出现一些奇妙的事情 xff1a var num 61 23 number类型 num 61 34 23 34 string类型 34 23 34
  • H5

    一 总体变化 1 H5文档结构 span style font family SimSun font size 18px lt DOCTYPE html gt lt html gt lt head gt lt title gt 这是标题 l
  • JavaScript进阶之--DOM事件、动画(运动框架)

    DOM事件 一 事件流 描述的是从页面中接收事件的顺序 当你点击一个容器里的子控件时 xff0c 默认同时也点击了这个父容器 事件冒泡 ie xff1a 事件最开始由最具体的元素接收 xff0c 然后逐级向上传播到最不具体的结点 子 父 祖

随机推荐