//题目:C++实现链表逆序打印、链表反转
//  如何将链表逆序,取决于题目的要求。如果面试官只要求打印,一般不改动链表结构为好,如果要求改变链表的方向,则需要改变结构,再顺序打印。
//  方法1:只逆序打印,不改变结构。采用递归,到达尾结点时打印输出,否则进入下一个结点的递归,当递归一层层退出的时候,便可以实现从尾到头的打印。
//  方法2:头插法,改变结构。从第二个结点开始往后,依次把每个结点移至链表头部,要注意最后链表不要是断裂的。
//  方法3:改变指针方向。从头结点开始,依次把结点的next指针断开指向该结点的前结点。要注意保存好,前结点、当前结点和下一个结点。
//  方法4:只逆序打印,不改变结构。利用栈的后进先出来实现逆序。
//
//  注意:链表为空、链表只有一个结点的情况
//  完整代码如下:
#include<iostream>
#include <stack>
using namespace std;
struct ListNode
{  int value;  ListNode *next;
};
void ReversePrint(ListNode *pHead)//递归实现逆序打印(不改变链表结构)
{  if(pHead!=NULL)  {  if(pHead->next!=NULL)  ReversePrint(pHead->next);  cout<<pHead->value<<" ";  }
}
ListNode *ReverseList1(ListNode *pHead)//头插法(改变链表结构)
{  if(pHead==NULL)  return NULL;  ListNode *p=pHead->next;  ListNode *newHead=pHead;  while(p!=NULL)         //将p结点移到链表最前方  {         pHead->next=p->next;//头结点指向p的下一个结点  p->next=newHead; //p插入链表最前方  newHead=p;      //链表新头结点更新为p  p=pHead->next;//处理下一个结点,该结点位于头结点后  }  return newHead;
}
ListNode *ReverseList2(ListNode *pHead)//依次改变指针方向(改变链表结构)
{  ListNode *pre=NULL;  ListNode *p=NULL;  while(pHead!=NULL){  p=pHead->next;   //保存剩余链表  pHead->next=pre;//断开剩余链表头结点pHead,指向pre  pre=pHead;  //pre更新  pHead=p;    //head更新  }  return pre;
}  int main()//主函数
{  int n;  cin>>n;   //输入元素个数                      ListNode* head=NULL;  ListNode* p=NULL;  ListNode* q=NULL;  for(int i=0;i<n;i++)//分配内存,依次输入元素  {  q=new ListNode;   cin>>q->value;  if(head==NULL)  {  head=q;  p=head;  }  else  {  p->next=q;  p=p->next;  }  }  if(head==NULL)  return 0;  p->next=NULL;  //验证  cout<<"递归逆序打印: "<<endl;  ReversePrint(head);   cout<<endl<<"头插法反转链表: "<<endl;  ListNode* reverseHead;  reverseHead = ReverseList1(head);  p=reverseHead;  while(p!=NULL)  {  cout<<p->value<<" ";  p=p->next;  }  cout<<endl<<"改变指针方向反转链表(将链表再次反转): "<<endl;  p = ReverseList2(reverseHead);  //改变指针方向反转链表  while(p!=NULL)  {  cout<<p->value<<" ";  q=p;  p=p->next;  delete q;//释放内存  }  cout<<endl;  return 0;
}  //方法4:利用一个栈
void printListFromTailToHead(ListNode *pHead)
{  stack<ListNode*> nodes;  ListNode *p=pHead;  while(p!=NULL)  {  nodes.push(p);//入栈  p=p->next;  }  while(!nodes.empty())  {  p=nodes.top();//赋值  cout<<p->value<<endl;  nodes.pop();//删除栈顶元素  }
}  

C++实现链表逆序打印、链表反转相关推荐

  1. 【链表】C++链表反转、链表逆序打印

    转载地址:http://blog.csdn.net/yebanxin/article/details/51942598 题目:C++实现链表逆序打印.链表反转 如何将链表逆序,取决于题目的要求.如果面 ...

  2. 【链表】C++链表反转、链表逆序打印(三)

    题目:C++实现链表逆序打印.链表反转 如何将链表逆序,取决于题目的要求.如果面试官只要求打印,一般不改动链表结构为好,如果要求改变链表的方向,则需要改变结构,再顺序打印. 方法1:只逆序打印,不改变 ...

  3. 【链表】逆序打印链表

    1 public class Main { 2 3 // 逆序打印链表 4 public void reversePrint(Node node) { 5 if (node == null){ 6 r ...

  4. 算法习题---线性表之单链表逆序打印

    一:题目 逆序打印单链表中的数据,假设指针指向单链表的开始结点 二:思路 1.可以使用递归方法,来进行数据打印 2.可以借助数组空间,获取长度,逆序打印数组 3.若是可以,对链表数据使用头插法,逆序排 ...

  5. python单向链表逆序_链表逆序-Python实现

    题目描述: 给定一个带头节点的单链表,将其逆序.即如果单链表原来为head->1->2->3->4->5->6->7,那么逆序后变为head->7-&g ...

  6. 链表逆序 java_链表逆序(JAVA实现)

    题目:将一个有链表头的单向单链表逆序 分析: 链表为空或只有一个元素直接返回: 设置两个前后相邻的指针p,q,使得p指向的节点为q指向的节点的后继: 重复步骤2,直到q为空: 调整链表头和链表尾: 图 ...

  7. python单链表逆序_python链表倒序

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python 实现双向链表(图解)----双向链表双向链表也叫双链表,是链表的一 ...

  8. python逆序打印出各位数字_Python练习题 024:求位数及逆序打印

    [Python练习题 024] 给一个不多于5位的正整数,要求:一.求它是几位数,二.逆序打印出各位数字. ---------------------------------------------- ...

  9. 数据结构与算法java - 03 链表,单向链表,逆序打印单向链表

    链表 Linked List 有序 链表是以节点的方式来存储,链式存储 每个节点包含 data 域, next 域:指向下一个节点 链表的各个节点不一定是连续存放 链表分带头节点的链表和没有头节点的链 ...

最新文章

  1. mysql 隔离级别 快照_「数据库架构」三分钟搞懂事务隔离级别和脏读
  2. 客户端的js js脚本的引入 js的解析过程
  3. Hibernate3的jar包
  4. jsp页面播放服务器视频
  5. U 盘安装 CentOS的方法
  6. 业务流程图_你会用Visio制作专业的业务流程图吗?
  7. 虚拟机里Ubuntu编译内核方法
  8. python内置的字典dict中元素_Python内置字典;dict ,set
  9. html格式蠕虫病毒,XiaoBa自制蠕虫病毒[2018-1-10]
  10. 荆门市建设企业网站多少钱,荆门口碑好的网站建设多少钱
  11. 个人逾期,失信黑名单
  12. cairo裁剪使用分析
  13. 服务器可以装win7或win10系统吗,win10改win7用legacy还是uefi?_网站服务器运行维护,window...
  14. ❤️ 6个Python办公黑科技,工作效率提升100倍!HR小姐姐都馋哭了(附代码)❤️
  15. SQL Server Management Studio(SMSS)删除连接记录
  16. 电子学会 全国青少年软件编程等级考试(三级--八级)
  17. 已知某个班有 30 个学生,学习 5 门课程,已知所有学生的各科成绩。计算每个学生的平均成绩,并输出
  18. Kali Linux 学习日记6 - 局域网攻击
  19. 10天完成民猫电商毕设——商品模块实现1(3th day)
  20. MATLAB生成指定周期的三角波

热门文章

  1. Linux 网络编程详解一(IP套接字结构体、网络字节序,地址转换函数)
  2. JavaScript中eval()函数
  3. Windows Phone 7实现图片数据绑定
  4. 网络规划设计师考试说明
  5. 25--最后一个单词的长度
  6. Diango博客--1.Django的接客之道
  7. MATLAB显示错误使用untitled,新手,用gui界面画李萨如图,出错,求解答
  8. java中如何做模糊查询_到底Java里的模糊查询语句该怎么写
  9. linux环境部署ltmj,Linux系统安装与简单配置 图文.docx
  10. MySQL 之 索引