链表反转--理解链表指针的基本操作

链表反转--理解链表指针的基本操作

  • 链表反转的方法--主要是理解链表指针
  • 链表心得
    • 类节点是对象和指针区别:

链表反转的方法–主要是理解链表指针

  1. 根据值创建新列表
    Pasted image 20240604210101

  2. 用一个链表指针代替整个新链表
    Pasted image 20240604210932

  3. 两个链表的赋值
    Pasted image 20240604212308
    Pasted image 20240604212325
    Pasted image 20240604212455

  4. 递归求解反向链表
    Pasted image 20240604213709

  5. 用一个链表代替前后链表数据的跳动
    Pasted image 20240604213828
    Pasted image 20240604214345

链表心得

mad等号前面是指针指向,等号后面是节点
注意注意注意注意注意注意

mad等号前面是指针指向,等号后面是节点

其实对象作为虚拟头节点好理解一些

类指针如果没有初始化是不能够调用其中的属性

这种时候最好改的方式是变成类

Pasted image 20240604130251
这个就是错误的,改为类即可
Pasted image 20240604130519

Pasted image 20240604130527

类节点是对象和指针区别:

对象的话可以看着是一个存在的虚空节点

指针的话它其实就是头节点本身,不存在虚空节点这种说法

两者的区别可看,数据结构下面的链表和反转链表

//链表
#include <iostream>
#include<iterator>
using namespace std;

class Node
{
public:
	Node();
	~Node();
	Node(int data, Node* next);
	int data;
	Node* next;

private:
};

Node::Node(int data, Node* next)
	:data(data), next(next)
{
}

Node::Node()
{
}

Node::~Node()
{
}
class Singlelist
{
public:
	Singlelist();
	~Singlelist();
	void print();
	void add(int data);
	void iter_print();
	//尾插
	void add_tail(int data);
	Node* index_find(int index)
	{
		int i = 0;
		Node* p = &node_head;
		for (; p != NULL;)
		{
			p = p->next;

			if (i == index)
			{
				return p;
			}
			++i;
		}
		cout << "index out of range" << endl;
		return NULL;
	}
	void inde_add(int index, int data)
	{
		if (index == 0)
		{
			add(data);
			return;
		}
		Node* p = index_find(index - 1);
		if (p == NULL)
		{
			cout << "index out of range" << endl;
			return;
		}
		p->next = new Node(data, p->next);
	}
	void index_remove(int index)
	{
		if (node_head.next == NULL)
		{
			return;
		}
		if (index == 0)
		{
			node_head.next = node_head.next->next;;
			return;
		}
		Node* p = index_find(index - 1);
		if (p->next == NULL)
		{
			cout << "index out of range" << endl;
			return;
		}
		p->next = p->next->next;
	}
	void merge(Singlelist& list2)
	{
		Node* p1 = &(this->node_head);
		while (p1->next != NULL)
		{
			p1 = p1->next;
		}
		p1->next = list2.node_head.next;
		list2.node_head.next = NULL;
	}
	Node node_head;

private:
};

Singlelist::Singlelist()
{
	this->node_head.next = new Node(6666, NULL);
}

Singlelist::~Singlelist()
{
	//删除节点
	while (node_head.next != NULL)
	{
		Node* temp = node_head.next;
		node_head.next = node_head.next->next;
		delete temp;
		temp = NULL;
	}
}

void Singlelist::print()
{
	Node p = node_head;
	while (p.next != NULL)
	{
		cout << p.next->data << " " << endl;
		p.next = p.next->next;
	}
}
//头插
void Singlelist::add(int data)
{
	node_head.next = new Node(data, node_head.next);
}

void Singlelist::iter_print()
{
	for (Node* p = &node_head; p->next != NULL;)
	{
		cout << p->next->data << " ";
		p = p->next;
	}
}

void Singlelist::add_tail(int data)
{
	Node* p = &node_head;
	while (p->next != NULL)
	{
		p = p->next;
	}
	p->next = new Node(data, NULL);
}

int main2()
{
	Singlelist list;
	Singlelist list2;
	list2.add_tail(1);
	list2.add_tail(2);
	list2.add_tail(3);
	list2.add_tail(4);
	list2.iter_print();

	/*list.add(1);
	list.add(2);
	list.add(3);
	list.add(4);
	list.add(5);

	list.print();*/
	/*list.add_tail(6);
	list.iter_print();*/
	/*list.index_find(2);*/

	list.add(3);
	list.add(4);
	list.add(5);

	list.inde_add(1, 10);
	cout << endl;
	list.iter_print();
	cout << endl;
	list.index_remove(3);
	list.iter_print();
	cout << endl;
	list.merge(list2);
	list.iter_print();
	return 0;
}
//反转链表
#include<iostream>
using namespace std;
class Node
{
public:
	Node();
	~Node();
	Node(int data, Node* next = NULL) :data(data), next(next) {}

	int data;
	Node* next;
private:
};

Node::Node()
{
}

Node::~Node()
{
}
class List
{
public:
	List() :head(NULL) {}
	void print(List& list)
	{
		Node* temp = list.head;
		while (temp != NULL)
		{
			cout << temp->data << " ";
			temp = temp->next;
		}
		delete temp;
	}
	void reverse_create_list(List& list)
	{
		Node* new_head = NULL;
		while (list.head != NULL)
		{
			Node* temp = new Node(list.head->data, new_head);
			new_head = temp;
			list.head = list.head->next;
		}
		list.head = new_head;
	}
	void reverse_pop_list(List& list, List& new_list)
	{
		while (list.head != NULL)
		{
			Node* temp = list.pop(list);
			new_list.add(temp);
		}
	}
	Node* reverse_recursion_list(Node* node)
	{
		if (node == NULL || node->next == NULL)
		{
			//这里需要返回的是节点而不是NULL
			return node;
		}

		Node* new_head = reverse_recursion_list(node->next);
		cout << new_head->data << " ";
		node->next->next = node;
		node->next = NULL;
		return new_head;
	}
	void reverse_point_list(List& list)
	{
		Node* new_head = list.head;
		Node* Next = list.head->next;
		while (Next != NULL)
		{
			list.head->next = Next->next;
			//这里需要一直指向链表的头部
			Next->next = new_head;
			new_head = Next;
			Next = list.head->next;
		}
		list.head = new_head;
		delete Next;
	}
	Node* pop(List& list)
	{
		Node* temp = list.head;
		list.head = temp->next;
		return temp;
	}
	void add(Node* node)
	{
		node->next = this->head;
		this->head = node;
	}
	~List();
	Node* head;
private:
};

List::~List()
{
	while (this->head != NULL)
	{
		Node* temp = this->head;
		this->head = this->head->next;

		delete temp;
	}

	cout << "List Destructor called" << endl;
}
int main()
{
	List list;

	for (int i = 1; i <= 5; )
	{
		list.head = new Node(i, list.head);
		++i;
	}
	list.print(list);
	cout << endl;
	/*list.reverse_create_list(list);*/

	/*List new_list;
	list.reverse_pop_list(list, new_list);*/
	/*list.head = list.reverse_recursion_list(list.head);*/
	list.reverse_point_list(list);
	list.print(list);
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解决使用gets(getchar)函数无法输入字符(字符串)和scanf_s函数显示缺少“scanf_s”整型参数的问题

一.函数介绍 gets函数&#xff1a; 该函数就是读取字符串&#xff0c;遇到空格不会停止&#xff0c;直到遇到换行字符&#xff0c;但是也会读取最后的换行字符&#xff08;这也就是我在写代码的时候遇到的一个问题&#xff09; getchar函数&#xff1a; 和gets函数类似&#x…

初识JAVA中的包装类,时间复杂度及空间复杂度

目录&#xff1a; 一.包装类 二.时间复杂度 三.空间复杂度 一.包装类&#xff1a; 在Java中&#xff0c;由于基本类型不是继承自Object&#xff0c;为了在泛型代码中可以支持基本类型&#xff0c;Java 给每个基本类型都对应了一个包装类型。 1 基本数据类型和对应的包装类 &am…

数字塔问题

#include<iostream> using namespace std; //从下向上得到最优值 void dtower(int a[][100],int s[][100],int n) {for(int in; i>1; i--){for(int j1; j<i; j){if(in)s[i][j]a[i][j];else{int ts[i1][j];if(t<s[i1][j1])ts[i1][j1];s[i][j]a[i][j]t;}}} } void…

MapReduce复习

一、MapReduce概述 1.定义 是分布式运算框架 MapReduce&#xff1a;用户处理业务相关代码自身的默认代码 2.优势劣势 优点&#xff1a; 1&#xff09;.易于编程。用户只关心业务逻辑&#xff0c;实现框架的接口。 2&#xff09;.良好的扩展性。可以动态增加服务器&#…

找不到steam_api64.dll,无法继续执行的原因及解决方法

电脑已经成为我们生活中不可或缺的一部分。然而&#xff0c;在使用电脑的过程中&#xff0c;我们经常会遇到一些常见的问题&#xff0c;其中之一就是找不到某个特定的动态链接库文件&#xff0c;比如steamapi64.dll。这个问题可能会导致某些应用程序无法正常运行&#xff0c;给…

通过DirectML和ONNXRuntime运行Phi-3模型

更多精彩内容&#xff0c;欢迎关注我的公众号“ONE生产力”&#xff01; 上篇我们讲到通过Intel Core Ultra系列处理器内置的NPU加速运行Phi-3模型&#xff0c;有朋友评论说他没有Intel处理器是否有什么办法加速Phi-3模型。通常&#xff0c;使用GPU特别是NVIDA的GPU加速AI模型…

LeetCode746使用最小花费爬楼梯

题目描述 给你一个整数数组 cost &#xff0c;其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶。你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。请你计算并返回达到楼梯顶部的最低花费。 解析 动态…

【数据结构】穿梭在二叉树的时间隧道:顺序存储的实现

专栏引入 哈喽大家好&#xff0c;我是野生的编程萌新&#xff0c;首先感谢大家的观看。数据结构的学习者大多有这样的想法&#xff1a;数据结构很重要&#xff0c;一定要学好&#xff0c;但数据结构比较抽象&#xff0c;有些算法理解起来很困难&#xff0c;学的很累。我想让大家…

容器中运行ip addr提示bash: ip: command not found【笔记】

容器中运行ip addr提示bash: ip: command not found 原因没有安装ip命令。 rootdocker-desktop:/# ip addr bash: ip: command not found rootdocker-desktop:/# apt-get install -y iproute2

【WP】猿人学12_入门级js

https://match.yuanrenxue.cn/match/1 调试分析 打开控制台出现无限debugger&#xff0c;手动取消断点应对 手动点击各页面查看发包 m参数格式 加密数据时间戳 时间戳 时间: 2024-06-06 01:39:05时间戳: 1717609145我目前的时间是2024年6月4日21:56:22往前几分钟&#xf…

Audio PsyChat:web端语音心理咨询系统

这是一个在服务器本地运行的web语音心理咨询系统&#xff0c;咨询系统内核使用PsyChat&#xff0c;我们为其制作了Web前端&#xff0c;并拼接了ASR和TTS组件&#xff0c;使局域网内用户可以通过单纯的语音进行交互。其中ASR和TTS组件使用PaddleSpeech API。 使用 使用单卡3090…

混剪素材库有哪些?分享7个高质量混剪视频素材网站

作为自媒体创作者&#xff0c;我们经常需要高质量的混剪视频素材来吸引观众。今天&#xff0c;我将为大家介绍几个优质的视频素材网站&#xff0c;确保您的短视频制作既高效又充满创意。 蛙学府素材网 首推蛙学府素材网&#xff0c;这个平台真是创作者的福音。无论是短视频素材…

LLM的基础模型3:Transformer变种

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则提…

Redis页面优化

文章目录 1.Redis页面缓存1.思路分析2.首先记录一下目前访问商品列表页的QPS1.线程组配置10000次请求2.请求配置3.开始压测1.压测第一次 平均QPS为6122.压测第二次 平均QPS为6153.压测第三次 平均QPS为617 3.然后记录一下访问商品详情页的QPS1.线程组配置10000次请求2.请求配置…

数据泄露怎么防?企业文件加密来帮忙

在数字化时代&#xff0c;数据泄露事件频发&#xff0c;给企业带来了前所未有的安全挑战。企业的核心数据、商业机密、客户信息等一旦泄露&#xff0c;不仅会导致经济损失&#xff0c;还会损害企业的声誉和客户信任。因此&#xff0c;如何有效防止数据泄露&#xff0c;成为了企…

如何利用Varjo混合现实技术改变飞机维修训练方式

自2017年以来&#xff0c;总部位于休斯顿的HTX实验室一直在推进混合现实技术&#xff0c;与美国空军密切合作&#xff0c;通过其EMPACT平台提供可扩展的沉浸式飞机维护虚拟现实培训。 虚拟和混合现实对维修训练的好处&#xff1a; l 实践技能&#xff1a;提供一个非常接近真实场…

ECharts 图形化看板 模板(简单实用)

目录 一、官网 二、模板 ①定义请求​编辑 ② 将请求统一管理&#xff0c;别的页面引用多个请求时更便于导入。​编辑 ③最终模板 三、执行效果 四、后端代码 4.1 controller 4.2 xml 4.3 测试接口 一、官网 获取 ECharts - 入门篇 - 使用手册 - Apache ECharts 二、…

视频号上怎么卖货?需要直播,还有粉丝吗?一篇文章带你了解!

大家好&#xff0c;我是电商糖果 关于在视频号上卖货&#xff0c;这是大家最常提起的话题。 大家之所以对视频号卖货感兴趣&#xff0c;主要原因还是抖音卖货火起来了。 而视频号是和抖音处于同一个赛道&#xff0c;这两年也在往电商方向发力。 所以大家对视频号推出电商平…

四川景源畅信:抖音做直播有哪些人气品类?

随着互联网科技的飞速发展&#xff0c;抖音作为新兴的社交媒体平台&#xff0c;已经成为了人们日常生活中不可或缺的一部分。而在抖音平台上&#xff0c;直播功能更是吸引了大量的用户和观众。那么&#xff0c;在抖音上做直播有哪些人气品类呢?接下来&#xff0c;就让我们一起…

会计电子档案系统方案

会计电子档案系统方案是指建立一个以电子方式存储和管理会计档案的系统。该方案具体包括以下几个方面&#xff1a; 1. 系统架构设计&#xff1a;确定系统的组成以及各个组件之间的关联和交互方式。包括数据库设计、系统服务器和客户端的部署等。 2. 电子档案管理&#xff1a;建…