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

news2024/11/18 1:48:26

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

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

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

  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;
}

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

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

相关文章

将div渲染成textarea框,类似于ant design 的TextArea

一 先看效果 原始效果 输入时效果 二 代码如下 1. html 代码 <div className{style.divTextArea} contentEditable"true"></div> 2. Css(Less)代码 .divTextArea {width: 90%;margin-top: 10px;line-height: 28px;min-height: 60px;border: 1px solid …

优雅谈大模型10:MoE

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

牛客java基础(一)

A 解析 : java源程序只允许一个public类存在 &#xff0c;且与文件名同名 ; D hashCode方法本质就是一个哈希函数&#xff0c;这是Object类的作者说明的。Object类的作者在注释的最后一段的括号中写道&#xff1a;将对象的地址值映射为integer类型的哈希值。但hashCode()并不…

使用python绘制桑基图

使用python绘制桑基图 桑基图效果代码 桑基图 桑基图&#xff08;Sankey Diagram&#xff09;是一种用来表示流动&#xff08;如能源、资金、材料等&#xff09;在不同实体之间转移的图表。 每个流的宽度与流量成正比&#xff0c;通常用于显示能量或成本流动的分布情况。 桑基…

【TB作品】MSP430F149单片机,广告牌,滚动显示

LCD1602滚动显示切换播放暂停字符串 显示Public Places 显示No Smoking 播放 暂停 部分代码 char zifu1[] "Public Places "; char zifu2[] "Class Now "; char zifu3[] "No admittance "; char *zifu[] { zifu1, zifu2, zifu3 }…

初识C++ · 模板进阶

目录 前言&#xff1a; 1 非类型模板参数 2 按需实例化 3 模板特化 4 模板的分离编译 前言&#xff1a; 前面模板我们会了简单的使用&#xff0c;这里带来模板的进阶&#xff0c;当然&#xff0c;也就那么几个知识点&#xff0c;并不太难。 1 非类型模板参数 先来看这样…

C语言过度C++语法补充(面向对象之前语法)

目录 1. C相较于C语言新增的语法 0. C 中的输入输出 1. 命名空间 1. 我们如何定义一个命名空间&#xff1f; 2. 如何使用一个命名空间 3. 命名空间中可以定义什么&#xff1f; 4. 在 相同或者不同 的文件中如果出现 同名的命名空间 会如何&#xff1f; 5. 总结~~撒花~~…

大模型基础——从零实现一个Transformer(1)

一、Transformer模型架构图 主要模块&#xff1a; embedding层&#xff1a; Input/Output Embedding&#xff1a; 将每个标记(token)转换为对应的向量表示。 Positional Encoding&#xff1a;由于没有时序信息&#xff0c;需要额外加入位置编码。 N个 block堆叠: Multi-Head …

vue不同页面切换的方式(Vue动态组件)

v-if实现 <!--Calender.vue--> <template><a-calendar v-model:value"value" panelChange"onPanelChange" /></template> <script setup> import { ref } from vue; const value ref(); const onPanelChange (value, mod…

Oracle EBS AP发票验证-计税期间出现意外错误解决方法

系统版本 RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.6 问题症状: **打开发票题头或发票行“税详细信息”**错误提示如下: 由于以下原因而无法针对"税"窗口中所做的修改更新 Oraclee Payables信息: 尚未为税率或帐户来源税率设置可退回税/应纳税额帐户。请…

【Linux】The server quit without updating PID file的几种解决方案

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。 &#x1f913; 同时欢迎大家关注其他专栏&#xff0c;我将分享Web前后端开发、人工智能、机器学习、深…

简单聊下服务器防病毒

在当今数字化时代&#xff0c;服务器作为数据存储、处理与传输的核心设备&#xff0c;其安全性显得尤为关键。服务器防病毒工作&#xff0c;不仅是保障企业信息安全的重要一环&#xff0c;更是维护用户数据隐私的关键举措。以下&#xff0c;我们将从多个方面&#xff0c;简单探…

29网课交单平台 epay.php SQL注入漏洞复现

0x01 产品简介 29网课交单平台是一个专注于在线教育和知识付费领域的交单平台。该平台基于PHP开发,通过全开源修复和优化,为用户提供了高效、稳定、安全的在线学习和交易环境。作为知识付费系统的重要组成部分,充分利用了互联网的优势,为用户提供了便捷的支付方式、高效的…

Java使用OpenCV计算两张图片相似度

业务&#xff1a;找出两个表的重复的图片。 图片在表里存的是二进制值&#xff0c;存在大量由于一些特殊情况例如扫描有差异&#xff0c;导致图片存的二进制值不同&#xff0c;但图片其实是一样来的。 所以找出两个表重复相同的图片&#xff0c;不可能只是单纯的比较二进制值…

若依RuoYi-Vue分离版—增加通知公告预览及缩放功能

若依RuoYi-Vue分离版—增加通知公告预览及缩放功能 前言开发通知公告 前言 若依分离版的通知公告没有预览功能&#xff0c;想开发通知公告功能 开发通知公告 效果如下 具体开发内容 修改若依notice代码如下。 <template><div class"app-container"&g…

三十五篇:数字化转型的引擎:赋能企业的ERP系统全景

数字化转型的引擎&#xff1a;赋能企业的ERP系统全景 1. 引言 在这个快速变化的数字时代&#xff0c;现代企业面临着前所未有的挑战和机遇。企业资源计划&#xff08;ERP&#xff09;系统&#xff0c;作为数字化转型的核心&#xff0c;扮演着至关重要的角色。它不仅是企业运营…

霸气的短视频:成都科成博通文化传媒公司

霸气的短视频&#xff1a;瞬间的力量与魅力 在数字化浪潮中&#xff0c;短视频以其独特的魅力迅速崛起&#xff0c;成为社交媒体的新宠。而在众多短视频中&#xff0c;那些充满霸气、让人热血沸腾的作品&#xff0c;总能引起广泛的关注和讨论。成都科成博通文化传媒公司将从内…

Linux文本处理三剑客之awk命令

官方文档&#xff1a;https://www.gnu.org/software/gawk/manual/gawk.html 什么是awk&#xff1f; Awk是一种文本处理工具&#xff0c;它的名字是由其三位创始人&#xff08;Aho、Weinberger和Kernighan&#xff09;的姓氏首字母组成的。Awk的设计初衷是用于处理结构化文本数…

SSM整合总结

一.核心问题 (一)两个容器 web容器 web相关组件&#xff08;controller,springmvc核心组件&#xff09; root容器 业务和持久层相关组件&#xff08;service,aop,tx,dataSource,mybatis,mapper等&#xff09; 父容器&#xff1a;root容器&#xff0c;盛放service、mapper、…

前端 JS 经典:打印对象的 bug

1. 问题 相信这个 console 打印语句的 bug&#xff0c;其实小伙伴们是遇到过的&#xff0c;就是你有一个对象&#xff0c;通过 console&#xff0c;打印一次&#xff0c;然后经过一些处理&#xff0c;再通过 console 打印&#xff0c;发现两次打印的结果是一样的&#xff0c;第…