单链表逆置

  • 单链表原地逆置
  • 单链表利用栈逆置
  • .cpp文件
  • 运行结果

单链表原地逆置

List Reverse(List L1){/*构造链表q替代L1(使得在逆置链表的时候L1本身不变)* 构造完以后q指向q链表末尾* 而指针p全程始终指向q链表的头结点* 从指针p(q链表头结点处)开始进行链表逆置* (实际上是把q链表逐个拆开组成逆置链表):\* 设置指针prev置空* head = p->Next(第一个数据结点)* next = p->Next->Next(第二个数据结点)* 然后他俩逐个后推,将每次的head向后指向prev,prev也向前挪一位,* 实现prev始终指向逆置的链表第一个数据结点* 逆置结束之后再给prev添加一个头结点first,让L2指向first,返回L2即可完成* 此时:* q链表已经被拆成逆置链表了* L1不变(有头结点)* p只是指向原q链表的第一个头结点,* p->Next依然为原q链表第一个数据结点,* p->Next->Next = NULL(逆置的时候被拆了)* q依然指向原q链表的末尾,也就是逆置之后的第一个数据结点的位置* */List L2;List t = L1;List q = (List)malloc(sizeof(List));List p = q;t = t->Next;while(t != nullptr){PtrToNode s = (PtrToNode)malloc(sizeof(PtrToNode));s->Data = t->Data;q->Next = s;t = t->Next;if(t == nullptr){q = q->Next;q->Next = nullptr;break;}q = q->Next;}List prev = nullptr;List head = p->Next;List next = p->Next->Next;while(head != nullptr){head->Next = prev;prev = head;head = next;if(head == nullptr){break;}next = next->Next;}List first = (List)malloc(sizeof(List));first->Next = prev;L2 = first;return L2;
}

单链表利用栈逆置

List Reverse_stack(List L1){List L2 = (List)malloc(sizeof(PtrToNode));List L3 = L2;L1 = L1->Next;while(L1 != nullptr){List_stack.push(L1->Data);L1 = L1->Next;}const int List_stack_size = List_stack.size();for(int i = 0; i < List_stack_size; i++){PtrToNode s = (PtrToNode)malloc(sizeof(PtrToNode));s->Data = List_stack.top();L2->Next = s;L2 = L2->Next;List_stack.pop();if(List_stack.empty()){L2->Next = nullptr;}}return L3;
}

.cpp文件

//
// Created by 15328 on 2022/1/24.
//
#include<bits/stdc++.h>
using namespace std;
typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {ElementType Data;PtrToNode   Next;
};
typedef PtrToNode List;
stack<ElementType> List_stack;
List Read(){List list = (List)malloc(sizeof(List));List p = list;int N;int value = 0;scanf("%d",&N);for(int i = 0; i < N; i++){PtrToNode s = (PtrToNode)malloc(sizeof(PtrToNode));scanf("%d",&value);s->Data = value;s->Next = nullptr;list->Next = s;list = list->Next;}return p;
}
void Print(List list){List p = list->Next;while(p != nullptr){printf("%d ",p->Data);p = p->Next;}printf("\n");
}
List Reverse(List L1){/*构造链表q替代L1(使得在逆置链表的时候L1本身不变)* 构造完以后q指向q链表末尾* 而指针p全程始终指向q链表的头结点* 从指针p(q链表头结点处)开始进行链表逆置* (实际上是把q链表逐个拆开组成逆置链表):\* 设置指针prev置空* head = p->Next(第一个数据结点)* next = p->Next->Next(第二个数据结点)* 然后他俩逐个后推,将每次的head向后指向prev,prev也向前挪一位,* 实现prev始终指向逆置的链表第一个数据结点* 逆置结束之后再给prev添加一个头结点first,让L2指向first,返回L2即可完成* 此时:* q链表已经被拆成逆置链表了* L1不变(有头结点)* p只是指向原q链表的第一个头结点,* p->Next依然为原q链表第一个数据结点,* p->Next->Next = NULL(逆置的时候被拆了)* q依然指向原q链表的末尾,也就是逆置之后的第一个数据结点的位置* */List L2;List t = L1;List q = (List)malloc(sizeof(List));List p = q;t = t->Next;while(t != nullptr){PtrToNode s = (PtrToNode)malloc(sizeof(PtrToNode));s->Data = t->Data;q->Next = s;t = t->Next;if(t == nullptr){q = q->Next;q->Next = nullptr;break;}q = q->Next;}List prev = nullptr;List head = p->Next;List next = p->Next->Next;while(head != nullptr){head->Next = prev;prev = head;head = next;if(head == nullptr){break;}next = next->Next;}List first = (List)malloc(sizeof(List));first->Next = prev;L2 = first;return L2;
}List Reverse_stack(List L1){List L2 = (List)malloc(sizeof(PtrToNode));List L3 = L2;L1 = L1->Next;while(L1 != nullptr){List_stack.push(L1->Data);L1 = L1->Next;}const int List_stack_size = List_stack.size();for(int i = 0; i < List_stack_size; i++){PtrToNode s = (PtrToNode)malloc(sizeof(PtrToNode));s->Data = List_stack.top();L2->Next = s;L2 = L2->Next;List_stack.pop();if(List_stack.empty()){L2->Next = nullptr;}}return L3;
}
int main()
{List L1, L2, L3;L1 = Read();L2 = Reverse(L1);L3 = Reverse_stack(L2);cout << "显示输入的单链表数据:";Print(L1);cout << "单链表原地逆置:\n先构造原链表的副本,然后从头逐个拆开这个副本,逐个逆置成逆序链表: \n";Print(L2);cout << "单链表利用栈逆置:\n把第一次逆置后的链表从头逐个压栈,再逐个弹出栈赋值给新逆置链表的结点\n";Print(L3);return 0;
}

运行结果

E:\CODING__ALAN_CF\cmake-build-debug\Single_linkList_Reverse.exe
5
1 2 3 4 5
显示输入的单链表数据:1 2 3 4 5
单链表原地逆置:
先构造原链表的副本,然后从头逐个拆开这个副本,逐个逆置成逆序链表:
5 4 3 2 1
单链表利用栈逆置:
把第一次逆置后的从头逐个压栈,再逐个弹出栈赋值给新逆置链表的结点
1 2 3 4 5进程已结束,退出代码为 0

数据结构03:单链表逆置相关推荐

  1. java数据结构之单链表逆置算法

    单链表逆置算法1 设计思想:在链表类中新加成员方法getNode(int i),用来获取指定位置的节点,新建一个空单链表,将原链表的每个节点按照从后往前的顺序依次取出,再把节点的数据依次添加到新的链表 ...

  2. 数据结构:单链表逆置

    实验要求: 写出将单链表逆置的算法.即令单链表的第一个结点变为最后一个结点,第二个结点变为倒数第二个结点,-,最后一个结点变为第一个结点. 依次从键盘读入数据,逆序建立链表L: 逆置链表L(创建新的链 ...

  3. 【数据结构】单链表逆置的详解

    单链表的逆置 将单链表逆置: 定义一个前指针和一个后指针用来辅助工作指针 //头文件 #ifndef LINKLIST_H_INCLUDED #define LINKLIST_H_INCLUDEDst ...

  4. 【数据结构】单链表逆置:头插法图解

    利用头插法能重新建立带头节点的新链表 下面简单介绍一下,算法思想结合图示看 算法思想:逆置链表初始为空,表中节点从原链表中依次"删除",再逐个插入逆置链表的表头(即"头插 ...

  5. 【数据结构】无头节点的单链表逆置

    day1 牛客网刷题 C语言实现单链表逆置 C语言实现单链表逆置 由于一段时间没有用数据结构 刚开始有些忘记了 第一次真正在牛客网上进行调试 原来还会有调试用例 还要设置边界值 如果没有 测试也不会通 ...

  6. c语言借助栈单链表逆置,借助栈实现单链表逆置--数据结构

    标题: 借助栈实现单链表逆置 时 限: 1000 ms 内存限制: 10000 K 总时限: 3000 ms 描述: 用链式存储实现栈的初始化.入栈.出栈.取栈顶.判栈空等操作,在主函数中借助栈的基本 ...

  7. 单链表操作10-带头结点的单链表逆置(个人学习笔记,仅供参考)

    带头结点的单链表逆置 题目要求 单链表结点定义 函数接口定义 测试程序样例 输入样例 输出样例 答案 题目要求 设计算法Reverse( ),将带头结点的单链表A逆置,要求利用原有链表的链点,最后输出 ...

  8. 借助于栈结构将一个单链表逆置

    借助于栈结构将一个单链表逆置. 输入输出样例:1组 #1 样例输入: 5 //链表中有几个元素 1 2 3 4 5 //链表中的元素分别是什么 样例输出: 5 4 3 2 1 //逆置后输出,利用栈结 ...

  9. C语言实现不带头结点的单链表逆置的三种方法

    C语言实现不带头结点的单链表逆置的三种方法 直接循环 头插法 递归法 END! 直接循环 图片解释 ListNode* ReverseList1(ListNode *head) {if(head == ...

最新文章

  1. 深度丨AlphaGo Zero的启示:监督学习和无监督学习的利弊
  2. 导出数据在SQL Server中作为INSERT INTO
  3. 获取select被选中的option的值
  4. 专转本计算机第一章试题,江苏专转本 计算机第一章自测题(含答案).doc
  5. JavaScript 灯泡暗亮
  6. 浏览器复制网页链接到微信,显示却只有网页title解决
  7. Android基础教程之-------Android中两种设置全屏的方法!!!
  8. JLINK、JTAG、ULINK和STLINK的区别介绍
  9. 【SSH网上商城】struts搭建及实例
  10. cocoapods 更新指定的第三方库
  11. python词云背景图_python数据分析可视化,制作你想要的背景图词云
  12. J-Link 安装和配置
  13. 微机原理与接口技术重要的知识点
  14. Python Leetcode(507.完美数)
  15. 杭电oj(java)1091
  16. 深度学习主机环境配置: Ubuntu16.04+GeForce GTX 1080+TensorFlow
  17. Internal类或Internal成员讲解
  18. 山东省潍坊市谷歌高清卫星地图下载(百度网盘离线包下载)
  19. 汤力嘉-秒拍-10秒拍大片!
  20. 计算机组成原理复习题目

热门文章

  1. 非标准武术擂台机器人的设计思想——灰度传感器的使用
  2. style.zIndex
  3. shell 数组去重,去掉重复
  4. 京津冀大数据协同处理中心启动
  5. mc有什么红石机器人_我的世界红石机器人怎么做_我的世界红石机器人制作教程...
  6. 减少模板中的代码膨胀
  7. MacOS 便笺Stickies数据恢复
  8. 光的干涉衍射计算机模拟仿真技术,实验报告之仿真(光的干涉与衍射).doc
  9. 掌握AI图像篡改检测工具,轻松识别图片造假
  10. 小米超神服务器响应超时,小米超神:玩家难以忍受的现象盘点,都经历过才知道什么是绝望...