1 题目

问题 E: 算法2-24 单链表反转
时间限制: 10 Sec 内存限制: 128 MB
提交: 344 解决: 171
[提交][状态][讨论版][命题人:外部导入]
题目描述
根据一个整数序列构造一个单链表,然后将其反转。

例如:原单链表为 2 3 4 5 ,反转之后为5 4 3 2

输入
输入包括多组测试数据,每组测试数据占一行,第一个为大于等于0的整数n,表示该单链表的长度,后面跟着n个整数,表示链表的每一个元素。整数之间用空格隔开
输出
针对每组测试数据,输出包括两行,分别是反转前和反转后的链表元素,用空格隔开

如果链表为空,则只输出一行,list is empty

样例输入
5 1 2 3 4 5
0
样例输出
1 2 3 4 5
5 4 3 2 1
list is empty

2 分析

  • 题意:输出单链表以及反转后的单链表
  • 思路
  • 方法一:将头结点摘下,然后依次从第一个结点开始使用头插法插入到头结点后
  • 方法二:将结点的next指向其原结点的前驱,
  • 注意:
  • 处理第一个结点时,把其next域置空,因为它最后变成了尾结点
  • 处理完最后一个结点后,把头结点的指针指向它

3 参考代码

#include 

struct LNode
{
int m_data;
LNode* next;
};

void Create(LNode* &L, int n){
L = new LNode;
LNode* r = L;
int data;

for (int i = 0; i != n; ++i)
{
LNode* p = new LNode;
scanf("%d", &data);
p->m_data = data;
r->next = p;
r = p;
}
r->next = NULL;
}

void Print(LNode* &L){
LNode* p = L->next;
while(p != NULL){
printf("%d", p->m_data);
if(p->next != NULL) printf(" ");
p = p->next;
}
printf("\n");
}

void Reverse1(LNode* &L){
LNode *p, *r;//p:工作指针 r:p的后继 防止断链
p = L->next;//从第一个元素开始
L->next = NULL;
while(p != NULL){
//依次将元素摘下,使用头插法插入到头结点后
r = p->next;
p->next = L->next;//将p插入到头结点之后
L->next = p;
p = r;
}
}


void Reverse2(LNode* &L){
LNode *pre, *p = L->next, *r = p->next;
p->next = NULL;//处理第一个结点
while(r != NULL){//r为空,则p为最后一个结点
pre = p;
p = r;
r = r->next;
p->next = pre;//指针反转
}
L->next = p;//处理最后一个结点
}


int main(int argc, char const *argv[])
{
int n;
LNode* L;
while(scanf("%d",&n) != EOF){
if(n == 0) printf("list is empty\n");
else{
Create(L, n);
Print(L);
Reverse2(L);
Print(L);
}

}


return 0;
}