参考

#include <iostream>
using namespace std;class List {
public://节点结构struct Node{int data;Node * next;Node(const int& d):data(d),next(NULL){}};Node *head;//头节点public:List(){create_List();}~List(){}//创建头结点void create_List();Node *insert(const int& d);Node *reverse(Node *head);Node *recursive_reverse(Node *head);void print(Node *hd);void print(Node *hd,int i);
};void List::create_List(){head = new Node(0);
}//尾插法建立链表
List::Node* List::insert(const int& d)
{Node *current;current = head; //current和head的data和next域相同,current = head; current->next = head->next = NULL; head->next存的是下一个节点的首地址.for(int i = 0; i< d; i++){Node *p = new Node(i);current->next = p;//将新建的p节点插入;如新申请p地址0x10,current->nextcurrent = p;  //将r指向p,从而可以继续向后面插入}current->next = NULL;//将尾结点赋值为空return head;
}
//打印函数
void List::print(Node *hd){for(Node *p = hd->next; p != NULL; p=p->next)cout << p->data << " ";cout << endl;
}void List::print(Node *hd,int i){for(Node *p = hd; p != NULL && p->next != NULL; p=p->next)cout << p->data << " ";cout << endl;
}//非递归反转链表
List::Node* List::reverse(List::Node *head){Node* p,*q,*tmp;//使用p和q两个指针配合工作,使得两个节点间的指向反向,同时用r记录剩下的链表p = head->next;q = NULL;head->next = NULL;//旧的头指针是新的尾指针,next需要指向NULLwhile(p){tmp = p->next;//先保留下一个step要处理的指针p->next = q;//然后p和q交替工作进行反向q = p;p = tmp;}head->next = q;//tmp为NULL,head->next指向最后一个节点q,就反转过来了.return head;
}
//递归反转
List::Node* List::recursive_reverse(List::Node* hd){//链表为空直接返回,而H->next为空是递归基if(hd == NULL || hd->next == NULL){//cout << "----hd:"<<hd<<" hd->next:"<<hd->next<<endl;return hd;}//cout << "====hd:"<<hd<<" hd->next:"<<hd->next<<endl;Node* new_hd=recursive_reverse(hd->next);//一直循环到链尾//cout << "hd:"<<hd<<" hd->next:"<<hd->next<<endl;//cout << "hd:"<<hd<<" hd->next->next:"<<hd->next->next<<endl;//cout <<"data222: "<<hd->next->data << endl;hd->next->next = hd;//本来hd->next->next=0x00为尾节点,现在hd->next->next = hd,指向head->next上一个节点.//cout << "hd:"<<hd<<" hd->next:"<<hd->next<<" hd->next->next:"<<hd->next->next<<endl<<endl;hd->next=NULL;//hd->next后节点为NULL,即尾节点,尾节点不断向前移动.return new_hd;//新链表头永远指向的是原链表的链尾
}
int main(int argc, const char * argv[])
{List list;List::Node *new_head;cout << "链表反转前:";new_head = list.insert(5);list.print(new_head);cout << "链表反转后:";new_head = list.reverse(new_head);list.print(new_head);cout << "链表反转后:";new_head = list.recursive_reverse(new_head);list.print(new_head,0);return 0;
}

单向链表反转(逆置)相关推荐

  1. 带头结点单链表就地逆置算法

    1.带头结点单链表就地逆置算法 部分函数调用参考如下:https://blog.csdn.net/qq_50504109/article/details/120288749 /*** 单向链表的逆置, ...

  2. 头插法逆置单向链表c语言,单链表的逆置(头插法和就地逆置)

    今天课间的时候偶然看到了一个面试题:单链表的逆置,看了题解感觉乖乖的,貌似和以前看的版本不搭,于是重新进行了一番探究 单链表的逆置分为两种方法:头插法和就地逆置法,这两种方法虽然都能够达到逆置的效果, ...

  3. 【C++】链表反转逆序|建立、删除、修改、插入|linux内核链表与普通链表

    目录 C++实现链表逆序 链表的建立.删除.修改.插入 linux内核链表与普通链表 C++实现链表逆序 实现链表逆序,首先要有一个链表,下面是链表的结构体: typedef struct listn ...

  4. 经典算法——单向链表反转

    1. 题目 单向链表反转是一道经典的求职面试笔试或机试题.给定如下如下链表的节点定义: struct LinkNode {int value;LinkNode* next; }; 比如有一个链表是这样 ...

  5. 6-1 带头结点的单链表就地逆置 (10 分)

    6-1 带头结点的单链表就地逆置 (10 分) 本题要求编写函数实现带头结点的单链线性表的就地逆置操作函数.L是一个带头结点的单链表,函数ListReverse_L(LinkList &L)要 ...

  6. C语言实现单链表的逆置

          单链表的逆置是一个非常经典的问题,这里利用两个思想进行解决.       首先,我们需要看下原理图,其实两个思想都是一样的,都是使后一个的节点的 next 指针指向前一个节点,依次递推,直 ...

  7. 无头结点单链表的逆置_单链表的增删查 逆置 倒数第k个节点等问题

    对于单链表而言,它没有双链表那么复杂,它只有头节点,尾节点,节点数据,后继指针.在下面本人实现了 单链表的 增   删   插  查  改. #include #include #include #i ...

  8. SDUT_2118 数据结构实验之链表三:链表的逆置

    点击打开链接 数据结构实验之链表三:链表的逆置 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem De ...

  9. 无头结点单链表的逆置_第1章第2节练习题11 就地逆置单链表

    ## 问题描述 > 试编写在带头结点的单链表就地逆置,所谓"就地"是指辅助空间为O(1) ## 算法思想1 > 将头结点摘下,然后从第一个结点开始,依次插入到头节点的后 ...

最新文章

  1. ajax点赞只能点一次,php+mysql+ajax局部刷新点赞取消点赞功能(每个账号只点赞一次).pdf...
  2. Python-OpenCV 处理视频(二): 视频处理
  3. 如何做可靠的分布式锁,Redlock真的可行么
  4. python内置模块有哪些_python中那些小众但有用的内置模块
  5. 人脸检测三个算法比较
  6. 【信息系统项目管理师】第6章-项目进度管理 知识点详细整理
  7. Python爬虫爬取微博热搜保存为 Markdown 文件
  8. json转换map多层嵌套问题
  9. 斗鱼服务器维护不能改名,斗鱼tv怎么改名字-斗鱼tv修改昵称的方法 - 河东软件园...
  10. 精度、召回率、准确率、F-score
  11. Linux工控主板的多通道高速并行采集方案(基于libiio)
  12. js获取对象数组中的id集合
  13. ajax鼠标悬停,mouseout后触发jQuery Ajax鼠标悬停事件
  14. theano环境配置
  15. 关于时间time_t和tm的介绍(很详细)
  16. 有符号数和无符号数区别
  17. mac安装cornerston3
  18. opc-da协议机器数据采集-python
  19. ubuntu安装vasp_vasp编译简略指南(自用)
  20. React Redux入门

热门文章

  1. C++ 类模板三(类模版中的static关键字)
  2. 转:移动网络下的性能优化之省电篇
  3. elasticsearch 随笔
  4. 利用jsoup 如何从网页中下载图片
  5. 2021年年度最优质开源软件
  6. 谷歌有情怀!谷歌开放大规模音频数据集 AudioSet
  7. android 网络gif_Android SurfaceView实现GIF动画架包,播放GIF动画
  8. leecode - 入门 -- 双指针秒杀数组/链表题目
  9. Javascript第六章JavaScript字面量加数组创建对象第三课
  10. 这个是我学习的所有sql语句的写法