题目描述:
输入一个链表,反转链表后,输出链表的所有元素。
(hint : 请务必使用链表)
输入:
输入可能包含多个测试样例,输入以EOF结束。
对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000):代表将要输入的链表的个数。
输入的第二行包含n个整数t(0<=t<=1000000):代表链表元素。
输出:
对应每个测试案例,
以此输出链表反转后的元素,如没有元素则输出NULL。
样例输入:
5
1 2 3 4 5
0
样例输出:
5 4 3 2 1
NULL
我们需要设置三个指针,分别指向当前要反转的节点、当前要反转节点的前一个节点、当前要反转节点的下一个节点。要注意链表为空,以及只有一个头结点的情况。
#include<stdio.h>
#include<stdlib.h>
struct ListNode
{
int m_nValue;
ListNode* m_pNext;
};
/*
递归实现链表反转,需要三个指针pNode指向当前节点
pPre指向反转后前节点
pNext指向反转后后节点
*/
ListNode* reverseList(ListNode* pHead)
{
if(pHead==NULL)
return NULL;
ListNode* pReversedHead=NULL;
ListNode* pNode=pHead;
ListNode* pPrev=NULL;
while(pNode!=NULL)
{
ListNode* pNext=pNode->m_pNext;
if(pNext==NULL)
pReversedHead=pNode;
pNode->m_pNext=pPrev;
pPrev=pNode;
pNode=pNext;
}
return pReversedHead;
}
int main()
{
int number;
while(scanf("%d",&number)!=EOF)
{
int headData;
scanf("%d",&headData);
ListNode* pHead=(ListNode*)malloc(sizeof(ListNode));
if(pHead==NULL)
exit(0);
pHead->m_nValue=headData;
pHead->m_pNext=NULL;
ListNode* pCur=pHead;
for(int i=0;i<number-1;i++)
{
int pData;
scanf("%d",&pData);
ListNode* pNode = (ListNode*)malloc(sizeof(ListNode));
if(pNode==NULL)
exit(0);
pNode->m_nValue=pData;
pNode->m_pNext=NULL;
pCur->m_pNext=pNode;
pCur=pCur->m_pNext;
}
ListNode* headNode=reverseList(pHead);
printf("%d",headNode->m_nValue);
}
return 0;
}
结果:
分享到:
相关推荐
描述了反转链表的用法,提供了两种方法,十分简单,实用。
反转链表 迭代法## 逐个节点反转## 更新指针位置## 返回反转后的头结点反转 a 到 b 之间的结点反转区间 [a, b) 的元素,注意是左闭右开K 个一组
LeetCode 206的题目是“反转链表”(Reverse Linked List),它要求将一个单链表的所有节点反转,并返回反转后链表的头节点。这是一个基础但非常重要的链表操作问题,它不仅考察了对链表数据结构的理解,还涉及到了...
反转链表C实现
反转链表.md
python 实现 反转链表
反转链表,记录了详细的题目解析思路以及Java语言的参考代码。 适合人群:学习算法和数据结构的程序员或学生,尤其是想系统学习链表操作的人。 能学到什么:掌握链表虚拟头节点设置方法;练习链表基本操作函数如增删...
使用Java语言实现剑指offer上面的第22题,反转链表。
22.反转链表1
c语言基础 c语言基础_c语言编程基础之链表操作示例_反转链表
反转链表 II.md
1.1 从尾到头打印链表内容——辅助栈 1.2 从尾到头打印链表内容——递归法 2.1 反转链表——普通循环反转 2.2 反转链表——头插法反转
015-反转链表题目描述输入一个链表,反转链表后,输出新链表的表头。思路从原链表的头部一个一个取节点并插入到新链表的头部。指针tmp指向还没进行反转的原链表头部
java基础面试题反转链表本资源系百度网盘分享地址
递归反转链表的一部分.md
k个一组反转链表.md
数组和链表(使用场景和反转链表) 数组和链表.pdf