反转链表:输入一个链表的头结点,反转该链表并输出反转后的链表的头结点。...
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
反转链表:输入一个链表的头结点,反转该链表并输出反转后的链表的头结点。...相关推荐
- 提示用户输入一个正整数n,如果n=5,就输出下列图形,其他n值以此类推
/* 提示用户输入一个正整数n,如果n=5,就输出下列图形,其他n值以此类推 ***** **** *** ** * */ #include <stdio.h> int main() { ...
- 键盘输入一个高精度的正整数n,去掉任意s个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的n和s,寻找一种方案,使得剩下的数最小
键盘输入一个高精度的正整数n,去掉任意s个数字后剩下的数字按原左右次序将组成一个新的正整数.编程对给定的n和s,寻找一种方案,使得剩下的数最小. 如输入: 1785434 输出: 13 #includ ...
- 输入一个字符,判断它如果是小写字母输出其对应大写字母;如果是大写字母输出其对应小写字母;如果是数字输出数字本身;如果是空格,输出“space”;如果不是上述情况,输出“other”。
输入一个字符,判断它如果是小写字母输出其对应大写字母:如果是大写字母输出其对应小写字母:如果是数字输出数字本身:如果是空格,输出"space":如果不是上述情况,输出"o ...
- 1041: 助推-滑翔弹道(钱学森弹道)(1级)输入一个正整数,表示滑翔总距离L。输出中程导弹的升阻比,结果保留0位小数。提示:可以用“%.0f”输出结果。
1041: 助推-滑翔弹道(钱学森弹道)(1级) 时间限制: 1 Sec 内存限制: 128 MB 提交: 60 解决: 28 [提交] [状态] [讨论版] [命题人:admin] 题目描述 截至2 ...
- Java初学者作业——输入一个五位数字,计算各位数字之和并输出,运行结果为五个数字之和(实践2)
返回本章节 返回作业目录 需求说明: 编写Java程序,输入一个五位数字,计算各位数字之和并输出,运行结果为五个数字之和. 实现思路: (1)声明变量num,用于存储用户输入的数字. (2)通过Sca ...
- 输入一个字符,判断它如果是小写字母输出其对应的大写字母,如果是大写字符输出其对应的小写字母 ,如果是数字则直接输出数字,不是上述情况输出other。
字符输入 描述 输入一个字符,判断它如果是小写字母输出其对应的大写字母,如果是大写字符输出其对应的小写字母 ,如果是数字则直接输出数字,不是上述情况输出other. 输入 输入只有一组数据,共4行,每 ...
- 将任意一个十进制数数字转换为二进制形式,并输出转换后的结果
package com.llh.demo; import java.util.Scanner; /** * * @author llh * */ public class Demo13 { ...
- Python程序:任意输入一个三位数,然后把三位数的位置反转输出。
第一种方法,把输入的三位数百位.十位和个位依次表示出来,然后将个位数字和百位数字进行交换. #输入number = 123,输出321 number = int(input('请输入一个三位数:')) ...
- c语言自动输入一位数字,c语言:要求输入一个四位整数,然后将各位数字按英文输出...
满意答案 我I就这样I 2015.11.22 采纳率:50% 等级:9 已帮助:568人 123456789101112131415161718192021222324252627282930# ...
- 从键盘输入一个小写字母,转化为大写字母并输出。
#include <stdio.h> void main() { char c1, c2; printf("请输入一个小写字母:\n"); sc ...
最新文章
- 调用bat文件执行java文件
- 获取某一日期所在月份的第一天日期或最后一天日期
- poj2420 A Star not a Tree? 【模拟退火】
- CNN(Convolutional Neural Networks)算法
- layui导航栏页面滚动固定_帮你搞定长滚动网页的设计!这5种设计策略需谨记!...
- VSCode自定义代码片段1——vue主模板
- 利用matlab写一个简单的拉普拉斯变换提取图像边缘
- 智能优化算法应用:基于GWO优化的指数熵图像多阈值分割 - 附代码
- SpringBoot+jersey实现
- 开发人员一定要加入收藏夹的网站
- Python爬虫--- 1.2 BS4库的安装与使用 1
- 老王教您怎么做cass7.1 8.0 9.1所有系列的复制狗 加密狗 破解狗
- Laya shader opengles 2.0 第一章-飘扬的旗帜 gitee代码
- python多条件求和_python – Numpy:条件求和
- bzoj4570: [Scoi2016]妖怪【凸包+对勾函数最小值】
- 5行代码提升时间序列预测,都有用!
- 02 LED的闪烁、模拟交通灯
- 推荐几本书给大家(二)
- linux电脑主机国产,“小皮匠”换工作电脑,国产“中国芯”迷你主机能否够用?...
- win10的内核隔离要不要开?