-
题目描述:
-
输入一个链表,反转链表后,输出链表的所有元素。
(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; }