2019独角兽企业重金招聘Python工程师标准>>>

题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后的链表的头结点。

    为了正确的反转一个链表,需要调整链表中指针的方向【指针反向】。注意,在单链表中,将一个节点的指向后继的指针指向它的前驱,将会导致链表的断裂。导致无法在单链表中遍历它的后继节点,因此,在调整某一节点的next 指针时,需要首先将其的后继节点保存下来。

    也就是说,在调整节点 i 的 next 指针时,除需要知道节点本身之外,还需要节点 i 的前一个节点 h,因为,我们把 i 的 next 指向其前驱结点 h,因此还事先需要保存节点 i 的后继节点 j,以防链表断裂。所以,相应的我们需要 3 个指针,分别指向当前遍历节点,其前驱结点 和 后继结点。

    注意,有 3 个问题:

    1) 当输入链表的头指针为空时,或者是当链表中,只有一个节点的情况,要防止程序崩溃

    2)反转后的链表不能出现断裂

    3) 反转后的头结点应该是原来链表的头结点

//反转单链表:定义一个函数,输入一个链表的头结点反转该链表,并输出反转后链表的头结点。【这里我们使用的是带有头结点的单链表】
#include<iostream>
using namespace std;

typedef int ElemType;
typedef struct LNode
{
 ElemType data;
 struct LNode *next;
}ListNode, *LinkList;

LinkList InitializeLinkList(LinkList L)
{
 if(L == NULL)
 {
  L = new ListNode();
  L->next = NULL;
 }
 return L;
}

void InsertLinkList(LinkList L, int e)
{
 if(L == NULL)
  return;
 ListNode *p, *s;
 s = L;
 while(s->next != NULL)
  s = s->next;
 p = new LNode();
 p->data = e;
 p->next = NULL;
 s->next = p; 
 s = p;
}

void PrintLinkList(LinkList L)
{
 if(L == NULL)
  return;
 ListNode *p = L->next;
 while(p != NULL)
 {
  cout << p->data << " ";
  p = p->next;
 }
 cout << endl;
}

//反转单链表:需要改变指针的方向
LinkList ReverseLinkList(LinkList L)
{
 ListNode *pPrev, *pNode, *pReverseHead;
 pNode = L;
 pPrev = NULL;
 pReverseHead = NULL;

 while(pNode != NULL)
 {
  ListNode *pNext;
  pNext = pNode->next;
  if(pNext == NULL)
   pReverseHead = pNode;
  pNode->next = pPrev;
  pPrev = pNode;
  pNode = pNext;
 }
 return pReverseHead;
}

int main()
{
 LinkList L, ReverseL;
 L = NULL;
 ReverseL = NULL;
 L = InitializeLinkList(L);
 int e;
 while(cin >> e)
 {
  InsertLinkList(L, e);
 }

 cout << "反转前的链表:"<< endl;
 PrintLinkList(L);

 cout << "反转后的链表:" << endl;
 ReverseL = ReverseLinkList(L);
 //PrintLinkList(ReverseL);
 while(ReverseL->next != NULL)
 {
  cout << ReverseL->data << " ";
  ReverseL = ReverseL->next;
 }
 cout << endl;

 system("pause");
 return 0;
}

转载于:https://my.oschina.net/u/2260265/blog/343443

反转链表:输入一个链表的头结点,反转该链表并输出反转后的链表的头结点。...相关推荐

  1. 提示用户输入一个正整数n,如果n=5,就输出下列图形,其他n值以此类推

    /* 提示用户输入一个正整数n,如果n=5,就输出下列图形,其他n值以此类推 ***** **** *** ** * */ #include <stdio.h> int main() { ...

  2. 键盘输入一个高精度的正整数n,去掉任意s个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的n和s,寻找一种方案,使得剩下的数最小

    键盘输入一个高精度的正整数n,去掉任意s个数字后剩下的数字按原左右次序将组成一个新的正整数.编程对给定的n和s,寻找一种方案,使得剩下的数最小. 如输入: 1785434 输出: 13 #includ ...

  3. 输入一个字符,判断它如果是小写字母输出其对应大写字母;如果是大写字母输出其对应小写字母;如果是数字输出数字本身;如果是空格,输出“space”;如果不是上述情况,输出“other”。

    输入一个字符,判断它如果是小写字母输出其对应大写字母:如果是大写字母输出其对应小写字母:如果是数字输出数字本身:如果是空格,输出"space":如果不是上述情况,输出"o ...

  4. 1041: 助推-滑翔弹道(钱学森弹道)(1级)输入一个正整数,表示滑翔总距离L。输出中程导弹的升阻比,结果保留0位小数。提示:可以用“%.0f”输出结果。

    1041: 助推-滑翔弹道(钱学森弹道)(1级) 时间限制: 1 Sec 内存限制: 128 MB 提交: 60 解决: 28 [提交] [状态] [讨论版] [命题人:admin] 题目描述 截至2 ...

  5. Java初学者作业——输入一个五位数字,计算各位数字之和并输出,运行结果为五个数字之和(实践2)

    返回本章节 返回作业目录 需求说明: 编写Java程序,输入一个五位数字,计算各位数字之和并输出,运行结果为五个数字之和. 实现思路: (1)声明变量num,用于存储用户输入的数字. (2)通过Sca ...

  6. 输入一个字符,判断它如果是小写字母输出其对应的大写字母,如果是大写字符输出其对应的小写字母 ,如果是数字则直接输出数字,不是上述情况输出other。

    字符输入 描述 输入一个字符,判断它如果是小写字母输出其对应的大写字母,如果是大写字符输出其对应的小写字母 ,如果是数字则直接输出数字,不是上述情况输出other. 输入 输入只有一组数据,共4行,每 ...

  7. 将任意一个十进制数数字转换为二进制形式,并输出转换后的结果

    package com.llh.demo; import java.util.Scanner; /**  *   * @author llh  *  */ public class Demo13 { ...

  8. Python程序:任意输入一个三位数,然后把三位数的位置反转输出。

    第一种方法,把输入的三位数百位.十位和个位依次表示出来,然后将个位数字和百位数字进行交换. #输入number = 123,输出321 number = int(input('请输入一个三位数:')) ...

  9. c语言自动输入一位数字,c语言:要求输入一个四位整数,然后将各位数字按英文输出...

    满意答案 我I就这样I 2015.11.22 采纳率:50%    等级:9 已帮助:568人 123456789101112131415161718192021222324252627282930# ...

  10. 从键盘输入一个小写字母,转化为大写字母并输出。

    #include <stdio.h> void main() {     char c1, c2;     printf("请输入一个小写字母:\n");     sc ...

最新文章

  1. 调用bat文件执行java文件
  2. 获取某一日期所在月份的第一天日期或最后一天日期
  3. poj2420 A Star not a Tree? 【模拟退火】
  4. CNN(Convolutional Neural Networks)算法
  5. layui导航栏页面滚动固定_帮你搞定长滚动网页的设计!这5种设计策略需谨记!...
  6. VSCode自定义代码片段1——vue主模板
  7. 利用matlab写一个简单的拉普拉斯变换提取图像边缘
  8. 智能优化算法应用:基于GWO优化的指数熵图像多阈值分割 - 附代码
  9. SpringBoot+jersey实现
  10. 开发人员一定要加入收藏夹的网站
  11. Python爬虫--- 1.2 BS4库的安装与使用 1
  12. 老王教您怎么做cass7.1 8.0 9.1所有系列的复制狗 加密狗 破解狗
  13. Laya shader opengles 2.0 第一章-飘扬的旗帜 gitee代码
  14. python多条件求和_python – Numpy:条件求和
  15. bzoj4570: [Scoi2016]妖怪【凸包+对勾函数最小值】
  16. 5行代码提升时间序列预测,都有用!
  17. 02 LED的闪烁、模拟交通灯
  18. 推荐几本书给大家(二)
  19. linux电脑主机国产,“小皮匠”换工作电脑,国产“中国芯”迷你主机能否够用?...
  20. win10的内核隔离要不要开?

热门文章

  1. Android 音视频开发入门指南
  2. JAVA修饰符类型(public,protected,private,friendly)
  3. 删除字符串中多余的空白字符和空行(C语言实现)
  4. 不快乐工作场所的生存法则
  5. 架构师之路 — 分布式系统 — 分布式事务难题
  6. 互联网协议 — LISP 位置/身份分离协议
  7. 5G NGC — BSF 会话绑定支持功能
  8. Kubernetes — 安装 Dashboard UI
  9. 可持久化链表(链式前向星)
  10. 深层学习:心智如何超越经验2.3 解释变化