c++数据结构算法复习基础-- 4 -- 线性表-单向循环链表-常用操作接口-复杂度分析

news2024/9/22 17:35:32

1、单向循环链表一

1)特点

每一个节点除了数据域,还有一个next指针域指向下一个节点(存储了下一个节点的地址)
末尾节点的指针域指向了头节点

在这里插入图片描述

析构函数思路图

在这里插入图片描述

2)代码实现

//定义结点
//单向循环链表
class CircleLink
{
public:
	//构造函数
	CircleLink()//这里是生成一个带头节点的
	{
		head_ = new Node();
		tail_ = head_;
		head_->next_ = head_;
	}
	//析构函数
	~CircleLink()//析构函数
	{
		Node* p = head_->next_;
		while(p != head_)
		{
			head_->next_ = p->next_;
			delete p;
			p = head_->next_;
		}
		delete head_;
	}
//共有方法区域
public:
	//尾插法  O(1)
	void InsertTail(int val)
	{
		Node* node = new Node(val);
		node->next_ = head_; //node->next_ = tail_->next_;
		tail_->next_ = node;
		tail_ = node; //更新tail_ 指针 指向新的尾节点
	}

	//头插法
	void InsertHead(int val)
	{
		Node* node = new Node(val);
		node->next_ = head_->next_;
		head_->next_ = node;

		//万一是空链表,要处理tail_
		if(node->next_ == head_)
			tail_ = node;
	}

	//删除节点
	void Remove(int val)
	{
		Node* q = head_;
		Node* p = head_->next_;

		while( p != head_ )
		{
			if( p->data_ == val )
			{
				//找到删除节点
				//if(p == tail_)
				//	tail_ = q;
				q->next_ = p->next_;
				delete p;

				//防止所删除的数据为尾节点,重置尾节点
				if(q->next_ == head_)
				{
					tail_ = q;
				}
				
				return ;
			}
			else
			{
				p = p->next_;
				q = q->next_;
			}
		}
	}
		
	//查询
	bool Find(int val) const
	{
		Node* p = head_->next_;
		while(p != head_)
		{
			if(p->data_ == val)
			{
				return true;
			}
			else
			{
				p = p->next_;
			}
		}

		return false;
	}
	
	//打印链表
	void Show() const
	{
		Node* p =head_->next_;
		while (p != head_)
		{
			cout<<p->data_<< " " ;
			p = p->next_;
		}
		cout<< endl;
	}

private:
	struct Node
	{
		Node(int date = 0):data_(date),next_(nullptr){}
		int data_;
		Node* next_;
	};

	Node* head_; // 指向头节点
	Node* tail_; //指向末尾节点
};

代码测试

int main()
{
	CircleLink clink;
	srand((time(NULL)));

	//尾插
	for(int i = 0; i <10;i++)
	{
		clink.InsertTail(rand() % 100);
	}
	clink.Show();

	//头插
	for(int i = 0; i <5;i++)
	{
		clink.InsertHead(i);
	}
	clink.Show();

	//删除
	clink.InsertTail(0);
	clink.Show();
	clink.Remove(0);
	clink.Show();
	clink.Remove(0);
	clink.Show();

}

测试结果:

在这里插入图片描述

2、约瑟夫环问题

约瑟夫环是一个数学的应用问题: 已知n个人 (以编号1,2,3…n分别表示)围坐在一张圆桌周围,从编号为k的人开始报数,数到m的那个人出列,它的下一个人又从1开始报数,数到m的那个人又出列,依此规律重复下去,直到圆桌周围的人全部出列,输出人的出列顺序。

代码实现1 – 不带头节点

#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <string.h>
using namespace std;

struct Node
{
	Node(int date = 0):data_(date),next_(nullptr){}
	int data_;
	Node* next_;
};

//约瑟夫环问题
void Joseph(Node* head,int k,int m)//这里指针指向的是第一个节点,该算法为不带头节点的单向循环链表应用
{
	Node* p = head;
	Node* q = head;

	//q指向最后一个节点,防止m==1 的特殊情况
	while(q->next_ != head)
	{
		q = q->next_;
	}

	//从第k个人开始报数的
	for(int i = 1; i < k; i++)
	{
		q = p;
		p = p->next_;
	}

	//走到地m个人
	for(;;)
	{
		for(int i = 1; i<m; i++)
		{
			q = p;
			p=p->next_;
		}

		//打印符合条件的节点数据
		cout<<p->data_ << " ";

		//删除p指向的节点
		if(p == q)//剩余最后一个节点
		{
			delete p;
			break;
		}
		/*if(p == head)//所删除节点为头节点
		{
			head = q->next_;
		}*/
		
		q->next_ = p->next_;
		delete p;
		p=q->next_;
	}
	cout<<endl;
}

测试代码

int main()
{
	Node *head = new Node(1);
	Node *n2 = new Node(2);
	Node *n3 = new Node(3);
	Node *n4 = new Node(4);
	Node *n5 = new Node(5);
	Node *n6 = new Node(6);
	Node *n7 = new Node(7);
	Node *n8 = new Node(8);

	head->next_ = n2;
	n2->next_ = n3;
	n3->next_ = n4;
	n4->next_ = n5;
	n5->next_ = n6;
	n6->next_ = n7;
	n7->next_ = n8;
	n8->next_ = head;

	Joseph(head,1,3);
	//Joseph(head,1,1);

	return 0;
}

运行结果

Joseph(head,1,3);

在这里插入图片描述

Joseph(head,1,1);

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2051005.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用python基于fastapi发布接口(一)

FastAPI官网地址 FastAPI基于Python 3.6+和Starlette框架,天生就带着高性能和异步的基因。 FastAPI的文档生成功能简直是开发者的福音! 你不再需要手动编写API文档,FastAPI能自动帮你搞定。 FastAPI还超级灵活,支持各种数据库和认证方式,无论是SQLite、PostgreSQL还是M…

【xilinx】TPM可信平台模块与 Zynq UltraScale+ PS SPI 接口

本博客&#xff08;Venu Inaganti&#xff09;介绍了可信平台模块 (TPM) 与 Zynq UltraScale PS SPI 控制器的连接。 目前唯一具有 TPM 的评估板是 KR260/KV260 SOM&#xff0c;因此为了帮助正在试验 Zynq UltraScale 设备的用户&#xff0c;本文介绍了如何通过 PMOD 连接器与…

【MongoDB】Java连接MongoDB

连接URI 连接 URI提供驱动程序用于连接到 MongoDB 部署的指令集。该指令集指示驱动程序应如何连接到 MongoDB&#xff0c;以及在连接时应如何运行。下图解释了示例连接 URI 的各个部分&#xff1a; 连接的URI 主要分为 以下四个部分 第一部分 连接协议 示例中使用的 连接到具有…

计算机视觉中的上采样与下采样:深入浅出实例代码解析

文章目录 一、引言二、下采样&#xff08;Downsampling&#xff09;三、上采样&#xff08;Upsampling&#xff09;1. 最近邻插值2.双线性插值3.转置卷积&#xff08;Deconvolution&#xff09;4.代码部分 四、总结 在计算机视觉领域&#xff0c;尤其是在深度学习和卷积神经网络…

宝塔面板部署webman项目+nginx反向代理

新建站点 新建一个站点&#xff0c;php版本选择纯净态即可&#xff0c;反正都是用不上的&#xff0c;域名填写你申请得到的域名 拉取代码 新建一个目录&#xff0c;然后将代码部署到本地 启动项目 推荐使用宝塔面板的进程守护管理器启动项目&#xff0c;其实就是用superviso…

ATT格式与Intel格式x86汇编指令的区别

AT&T公司 这个公司的创始人就是发明电话的贝尔&#xff0c;而Unix和C语言都是出自贝尔实验室的产物。 Intel公司 世界上第一片CPU是1971年发明的&#xff0c;型号是Intel生产的4004微处理器。 两种格式的区别 AT&T格式Intel格式目的操作数d、源操作数s op s, d 注…

vue2中使用i18n配置elementUi切换语言

1、下载插件 npm i vue-i18n8.22.2 2、新建文件夹i18n 3、编写index.js文件 import Vue from "vue"; import VueI18n from "vue-i18n"; import locale from element-ui/lib/locale; // 引入 elementui 的多语言 import enLocale from element-ui/lib/l…

【MySQL】C/C++连接MySQL客户端,MySQL函数接口认知,图形化界面进行连接

【MySQL】C/C引入MySQL客户端 安装mysqlclient库mysql接口介绍初始化mysql_init链接数据库mysql_real_connect下发mysql命令mysql_query获取出错信息mysql_error获取执行结果mysql_store_result获取结果行数mysql_num_rows获取结果列数mysql_num_fields判断结果列数mysql_field…

域自适应,你适应了嘛?

“最难的深度学习是谁&#xff1f;” “嗯&#xff0c;是迁徙学习吧&#xff1f;” “要分情况&#xff0c;不过&#xff0c;应该是迁徙学习吧&#xff1f; ” “不是迁徙学习嘛&#xff1f;” 目录 域自适应是啥&#xff1f; 域自适应的方法&#xff1f; 基于差异的方法…

Kafka系列之:Kafka Connect深入探讨 - 错误处理和死信队列

Kafka系列之&#xff1a;Kafka Connect深入探讨 - 错误处理和死信队列 一、快速失败二、YOLO&#xff1a;默默忽略坏消息三、如果一条消息掉在树林里&#xff0c;会发出声音吗&#xff1f;四、将消息路由到死信队列五、记录消息失败原因&#xff1a;消息头六、记录消息失败原因…

k8s Pod生命周期详解

文章目录 一、创建Pod二、启动Pod三、销毁Pod 共分为三步&#xff1a;创建Pod、启动Pod、销毁Pod 一、创建Pod K8S创建Pod的过程 二、启动Pod 1、kubelet调用容器运行时创建Pause容器&#xff0c;准备一个容器环境 2、创建初始化容器init container。如果有多个&#xff0c;…

打印网页使内容包含有效网络连接Print webpage with workable hyperlinks

小虎想打印网页&#xff0c;并且将里面有链接的文字带文字一起打印保存。 解决方法 利用谷歌浏览器的打印功能即可&#xff1a; Use print options in chrome.

构建一个Markdown编辑器:Fyne综合案例

在本文中&#xff0c;我们将通过一个完整的案例来介绍如何使用Go语言的Fyne库来构建一个简单的Markdown编辑器。Fyne是一个易于使用的库&#xff0c;它允许开发者使用Go语言来创建跨平台的GUI应用程序。 1. 项目结构 首先&#xff0c;我们需要创建一个Go项目&#xff0c;并引…

基于vllm部署大模型

VLLM&#xff08;非常大的语言模型&#xff09;在中文中通常指的是经过大量文本数据训练的神经网络模型&#xff0c;能够理解和生成类似人类语言的文本。这类模型是许多先进AI系统的核心&#xff0c;比如ChatGPT、GPT-4等。 VLLM 可以执行各种任务&#xff0c;如自然语言处理、…

【实用工具】使用Chrome插件搭建第二大脑!SuperMemory大语言模型登场,开源、免费、保存你需要的所有网站!——含入门安装教程

文章目录 项目简介项目搭建主要功能How do I use this?本地部署 项目简介 最近&#xff0c;有一款Github项目十分火爆&#xff0c;它专注于用超级内存打造自己的第二大脑。它是书签的 ChatGPT&#xff0c;基于Chrome 浏览器扩展导入推文或保存网站和内容&#xff0c;你可以访…

RTD2739 8K60Hz/4K 240Hz

RTD2739支持4K240Hz/80K60Hz。 RTD2739 supports input format up to 3840 x 2160 240Hz RTD2739 supports 3 ports of Ultra-High Speed Receiver can support DisplayPort1.4 In DisplayPort mode, four link layer speed HBR3 (8.1GHz), HBR2 (5.4GHz), HBR(2.7GHz), R…

理解Linux中的作业控制:详解fg、bg和jobs命令

理解Linux中的作业控制&#xff1a;详解fg、bg和jobs命令 文章目录 理解Linux中的作业控制&#xff1a;详解fg、bg和jobs命令1. 前言2. jobs 命令3. bg 命令4. fg 命令5. 简要总结6. 一图概览 1. 前言 ​ Linux系统中&#xff0c;作业控制是一个非常重要的概念&#xff0c;尤其…

成为Python砖家(1): 在本地查询Python HTML文档

本地是 macOS 系统。 下载 python html 格式文档 https://docs.python.org/3/download.html 下载logo png图像 https://www.python.org/community/logos/ 创建 PythonDoc.sh&#xff0c; 用于创建 PythonDoc.app: #!/bin/bash# This script generates /Application/Python…

【MySQL】order by 的排序策略

目录 一、全字段排序 二、磁盘临时文件辅助排序 三、RowId 排序 四、优化 order by 在前面的文章中我们分析了 explain 执行计划的各个字段&#xff0c;其中有一个 Extra 字段。 在执行计划中&#xff0c;Extra 字段如有 Using filesort 则表示使用到了排序。 而 MySQL 的…

小白做毕设——HTTP扫盲

工具下载 Postman&#xff08;发送 http 请求的工具&#xff09; 官网&#xff08;下载速度比较慢&#xff09;&#xff1a;https://www.postman.com/downloads/ Http 请求格式 请求地址请求方法状态码同源策略请求头响应头 接口类型 Post 接口&#xff08;新增数据&#x…