当前位置: 首页 > 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;

http://www.lryc.cn/news/372337.html

相关文章:

  • JVM堆栈的区别、分配内存与并发安全问题、对象定位
  • Python教程:机器学习 - 百分位数(4)
  • 数据结构习题(快期末了)
  • Http协议:Http缓存
  • idea插件开发之hello idea plugin
  • Sm4【国密4加密解密】
  • git如果将多次提交压缩成一次
  • android用Retrofit进行网络请求和解析
  • list容器的基本使用
  • 34万汉语词语成语反义词ACCESS\EXCEL数据库
  • yum方式更新Jenkins
  • 欢乐钓鱼大师保姆级教程,云手机辅助攻略解析!
  • 数据结构:手撕代码——顺序表
  • jenkins使用注意问题
  • Kaggle -- Titanic - Machine Learning from Disaster
  • 蓝牙音频解码芯片TD5163介绍,支持红外遥控—拓达半导体
  • windows 下 docker 入门
  • 《别让“想太多”挡了你的骑行路,对比一下更丝滑》
  • hadoop和hbase对应版本关系
  • 现代X86汇编-C和ASM混合编程举例
  • 485. 最大连续 1 的个数
  • 席卷的B站《植物大战僵尸杂交版》V2.0.88整合包,PC和手机可用,含通关存档和视频教程!
  • 液晶拼接屏企业应该采取哪些措施来提升整体竞争力和市场地位呢?
  • PHP在线生成查询产品防伪证书系统源码
  • 遥控玩具车电机驱动应用中的双H桥驱动芯片
  • Linux 基本指令1
  • 基于Seatunnel最新2.3.5版本分布式集群安装部署指南(小白版)
  • SSM小区疫情防控系统-计算机毕业设计源码03748
  • 英伟达算法岗面试,问的贼专业。。。
  • GIS之arcgis系列09:arcpy实现克里金差值