当前位置: 首页 > news >正文

单向环形链表的创建与判断链表是否有环

        单向环形链表的创建与单向链表的不同在于,最后一个节点的next需要指向头结点;

        判断链表是否带环,只需要使用两个指针,一个步长为1,一个步长为2,环状链表这两个指针总会相遇。

如下示例代码:

list.h

#ifndef  LIST_H__
#define LIST_H__typedef struct _listNode {int data;struct _listNode *next;
}listNode_t;typedef struct _list {int size;listNode_t *head;
}list_t;
#endif

list.c

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "list.h"list_t *listCreate(void)
{list_t *list = (list_t *)malloc(sizeof(list_t));if(list == NULL) {perror("malloc :");exit(-1);}list->size = 0;list->head = NULL;return list;
}int listInsertHead(list_t *list, int dat)
{listNode_t *pNode = (listNode_t *)malloc(sizeof(listNode_t));if(pNode == NULL) {perror("malloc :");exit(-1);}pNode->data = dat;pNode->next = NULL;listNode_t *headNode = list->head;if(headNode == NULL) {list->head = pNode;pNode->next = list->head; //pNode作为头结点,同时pNode的next指向头结点,构成环状} else {pNode->next = list->head; //在头部插入新的节点//找到末尾的节点,将末尾节点的next指向新的节点。while(headNode->next != list->head) {headNode = headNode->next;}headNode->next = pNode;//头结点指向新的节点list->head = pNode;}list->size ++;return 0;
}
bool listIsLoop(list_t *list)
{//如果链表是环状的,fast和slow总会相遇listNode_t *fast = list->head;listNode_t *slow = list->head;if(list->head == NULL || list->head->next == NULL) {return false;}while(fast->next->next != NULL || slow->next != NULL) {if(fast == slow) {return true;}}return false;
}void listDump(list_t *list)
{listNode_t  *temp = list->head;//这里可以验证链表是不是环状的,将size改为两倍大小,看是否循环输出while(list->size) {printf("%d-> ", temp->data);temp = temp->next;list->size --;}printf("\n");return ;
}
int main()
{list_t *list = listCreate();for(int i = 0; i < 5; i++) {listInsertHead(list, i);}listDump(list);printf("list %s loop\n", listIsLoop(list)? "is" : "is not" );return 0;

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【ArcGISPro SDK】构建多面体要素
  • matlab 异常值检测与处理——Z-score法
  • 软件设计师笔记-程序语言基础知识
  • 电子电气架构 --- 信息安全测试模糊测试
  • 【iOS】界面推出的方法
  • Opencv图像处理
  • HTML LocalStorage
  • 第1期测试社招面试经验月报
  • (BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等(1)
  • linux的持续性学习
  • C++ 中有符号数与无符号数的隐式转换与运算陷阱
  • Android14 WMS-窗口绘制之relayoutWindow流程(二)-Server端
  • Linux操作系统学习:day01
  • leetcode67:二进制求和
  • 享元模式
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • AHK 中 = 和 == 等比较运算符的用法
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • Joomla 2.x, 3.x useful code cheatsheet
  • js正则,这点儿就够用了
  • scrapy学习之路4(itemloder的使用)
  • vue:响应原理
  • 力扣(LeetCode)22
  • 那些年我们用过的显示性能指标
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 我从编程教室毕业
  • 我感觉这是史上最牛的防sql注入方法类
  • 学习笔记:对象,原型和继承(1)
  • 做一名精致的JavaScripter 01:JavaScript简介
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • 树莓派用上kodexplorer也能玩成私有网盘
  • (007)XHTML文档之标题——h1~h6
  • (done) 两个矩阵 “相似” 是什么意思?
  • (补充):java各种进制、原码、反码、补码和文本、图像、音频在计算机中的存储方式
  • (算法)求1到1亿间的质数或素数
  • (已解决)什么是vue导航守卫
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)jdk与jre的区别
  • (转载)利用webkit抓取动态网页和链接
  • ****Linux下Mysql的安装和配置
  • .NET Core跨平台微服务学习资源
  • .Net FrameWork总结
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .net操作Excel出错解决
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • .net中调用windows performance记录性能信息
  • [AI Google] Ask Photos: 使用Gemini搜索照片的新方法
  • [ASP.NET MVC]Ajax与CustomErrors的尴尬
  • [BZOJ2281][SDOI2011]黑白棋(K-Nim博弈)
  • [C#] 如何调用Python脚本程序
  • [CCF-CSP] 202303-4 星际网络II
  • [Contest20180313]灵大会议
  • [IE技巧] 让IE 以全屏模式启动