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

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

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

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

  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){//这里需要返回的是节点而不是NULLreturn 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.mzph.cn/web/22233.shtml

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

相关文章

Qt应用程序发布

一、静态编译发布 1.0:以Release模式构建工程 1.1:查看当前构建生成路径,并将所生成的.exe单独拷贝出来 1.2:将可执行文件*.exe拷贝至任一目标文件夹:D:\Temporary\QQIF 2:查看安装Qt时发布工具windeployqt.exe所在的目录 windeployqt.exe在Qt开发套件的bin目录下。Qt的每…

构建高效稳定的短视频直播系统架构

随着短视频直播的迅猛发展&#xff0c;构建一个高效稳定的短视频直播系统架构成为了互联网企业的重要挑战。本文将探讨如何构建高效稳定的短视频直播系统架构&#xff0c;以提供优质的用户体验和满足日益增长的用户需求。 ### 1. 短视频直播系统的背景 短视频直播近年来蓬勃发…

Pycharm 添加内容根

解决问题&#xff1a;包未能被正常引入时

try…except…finally语句

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 完整的异常处理语句应该包含finally代码块&#xff0c;通常情况下&#xff0c;无论程序中有无异常产生&#xff0c;finally代码块中的代码都会被执行…

2024 年该如何利用 MidJourney 创作AI艺术(详细教程)

什么是 Midjourney Midjourney 是根据文本提示创建图像的生成式人工智能的优秀范例。与 Dall-E 和 Stable Diffusion 一样&#xff0c;它已成为最受欢迎的人工智能艺术创作工具之一。与竞争对手不同的是&#xff0c;Midjourney 是自筹资金和封闭源代码的&#xff0c;因此对它的…

【WRF理论第二期】模型目录介绍

WRF理论第二期&#xff1a;模型目录介绍 1 WRF主目录2 WPS主目录3 编译后的可执行文件4 运行目录参考 了解 WRF 模型的目录结构有助于有效地管理和操作模型&#xff0c;从而确保模拟和分析工作的顺利进行。以下分解介绍WRF主目录、WPS主目录等。 Github-wrf-model/WRF 1 WRF…

leetCode-hot100-二分查找专题

二分查找 简介原理分析易错点分析例题33.搜索旋转排序数组34.在排序数组中查找元素的第一个和最后一个位置35.搜索插入位置240.搜索二维矩阵 Ⅱ 简介 二分查找&#xff0c;是指在有序&#xff08;升序/降序&#xff09;数组查找符合条件的元素&#xff0c;或者确定某个区间左右…

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

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

关于博图17安装体验过程—博图17安装失败原因(STEP7 许可证找不到)

目录 一、序言 二、正片 一、序言 该失败原因是在我使用Win11专业版安装博图17时出现的问题&#xff0c;也仅代表我的体验过程&#xff01;以下我将安装过程和解决问题的过程描述一下&#xff0c;希望可以帮助和我一样自己安装博图时能够解决出现的问题。 二、正片 如果阁下…

linux驱动学习(五)之字符设备

需要板子一起学习的可以这里购买&#xff08;含资料&#xff09;&#xff1a;点击跳转 一、 linux设备驱动分类 1、字符设备---char 应用程序与驱动程序在进行数据传输时&#xff0c;数据以"字节"为单位。 特点&#xff1a; [1] 按照顺序进行数据传输 [2] 数据传…

vscode专区

1.展示多行的文件导航标签,而非只有1行 1.1打开设置 1.2搜索该设置"workbench.editor.wrap.tabs",并勾选 1.3效果对比

vue+vscode 快速搭建运行调试环境与发布

1.安装node.js Node.js — Run JavaScript Everywhere 默认不断next 2.更换镜像地址 运行-cmd 执行以下代码安装 npm config set registry https://registry.npmmirror.com 检查node.js和镜像是否是否成功 node -v npm -v npm config get registry 3.安装打包工具 …

吊车报警的工作原理和使用场景_鼎跃安全

在现代建筑施工过程中&#xff0c;经常使用大型机械设备&#xff0c;如挖掘机、吊车、打桩机等&#xff0c;这些设备在施工过程中发挥着越来越重要的作用&#xff1b;同时&#xff0c;这些设备的作业频繁进行作业&#xff0c;对于接触到高压电线的风险也随之增加。大型机械设备…

Leetcode学习

回文数 反转一半数字 第一个想法是将数字转换为字符串&#xff0c;并检查字符串是否为回文。 但是&#xff0c;这需要额外的非常量空间来创建问题描述中所不允许的字符串。 第二个想法是将数字本身反转&#xff0c;然后将反转的数字与原始数字比较&#xff0c;如果它们是相同…

【计算机毕设】基于SpringBoot的中小企业设备管理系统设计与实现 - 源码免费(私信领取)

免费领取源码 &#xff5c; 项目完整可运行 &#xff5c; v&#xff1a;chengn7890 诚招源码校园代理&#xff01; 1. 研究目的 在中小企业中&#xff0c;设备管理是确保生产和运营效率的重要环节。传统的设备管理通常依赖于手工记录和人工管理&#xff0c;容易导致数据不准确、…

近屿OJAC带你解读:什么是ML?

概念定义 ML是机器学习&#xff08;Machine Learning&#xff09;的缩写。机器学习是人工智能的一个分支&#xff0c;它使计算机系统能够从数据中学习和改进&#xff0c;而无需进行明确的编程指令。简单来说&#xff0c;机器学习涉及到开发算法和统计模型&#xff0c;让计算机…

UE4 使用自带的插件制作音频可视化

1.插件默认为开启 2.新建共感NRT&#xff0c;选择要使用的音频 3.添加音频组件&#xff0c;添加共感NRT变量&#xff0c;选择新建的共感NRT对象 4.编写蓝图

基础—SQL—DQL(数据查询语言)分页查询

一、引言 上一篇博客学习了排序查询&#xff0c;这次来讲查询的最后一个部分&#xff1a;分页查询。 涉及到的关键字是&#xff1a;LIMIT 。 二、DQL—分页查询 对于分页&#xff0c;不管以后做的是传统的管理系统还是做互联网的项目&#xff0c;基本上都会遇到分页查询的操…

计网ppt标黄知识点整理第(4)章节——谢希仁版本、期末复习自用

路由器&#xff1a;查找转发表&#xff0c;转发分组。 IP网的意义&#xff1a;当互联网上的主机进行通信时&#xff0c;就好像在一个网络上通信一样&#xff0c;看不见互连的各具体的网络异构细节。如果在这种覆盖全球的 IP 网的上层使用 TCP 协议&#xff0c;那么就…

每天坚持写java锻炼能力---第一天(6.4)

今天的目标是菜单&#xff1a; B站/马士兵的项目菜单 package java1;import java.util.Scanner;public class Test {public static void main(String[] args) {while(true){ //3.加入死循环&#xff0c;让输入一直有System.out.println();System.out.println("--->项…