本题要求实现一个函数,将给定的单链表逆转。
函数接口定义:
List Reverse( List L );
其中List
结构定义如下:
typedef struct Node *PtrToNode;
struct Node {
ElementType Data; /* 存储结点数据 */
PtrToNode Next; /* 指向下一个结点的指针 */
};
typedef PtrToNode List; /* 定义单链表类型 */
L
是给定单链表,函数Reverse
要返回被逆转后的链表。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
ElementType Data;
PtrToNode Next;
};
typedef PtrToNode List;
List Read(); /* 细节在此不表 */
void Print( List L ); /* 细节在此不表 */
List Reverse( List L );
int main()
{
List L1, L2;
L1 = Read();
L2 = Reverse(L1);
Print(L1);
Print(L2);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
5
1 3 4 5 2
输出样例:
1
2 5 4 3 1
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
List Reverse( List L ){
if(L == NULL) return L; //这个是完成测试点3
struct Node *p,*q, *temp; //主要p指向L的指向,方便后续操作,并且有利于充当返回值
p = L;
q = p->Next;
p->Next = NULL;
/*
正常情况下*p=*q操作的是指针指向的目标,p=q操作的是指针本身——这是二者的本质区别
*/
while(q){
temp = q->Next; //将q的下一个节点交给temp;
q->Next = p; //将节点p加入到节点q之后
p = q; //使指针p指向指针q指向的目标(最终是p和q指向了同一目标,这个目标就是q指向的目标)
//若是*p=*q是把指针q指向的目标值赋给指针p指向的目标
q = temp; //使指针q指向指针temp指向的目标
}
return p;
}
代码详细,有对指针的理解与应用,加油