单链表逆转
程序员文章站
2022-06-07 20:58:40
...
题目描述
设计一个算法,通过遍历一趟,将链表中所有结点的链接方向逆转,仍利用原表的存储空间。
输入
5
1 2 3 4 5
输出
5 4 3 2 1
解题思路
由于规定了算法复杂度,而且不能再申请空间,所以只能在原链表上操作。先把原链表的值一个一个取出来后,用前插法插入原链表即可。
前插法
源代码
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
ElementType Data;
PtrToNode Next;
};
typedef PtrToNode List;
List Read();
List Inverse(List L);
void Print( List L );
int main()
{
List L,L1,L2,p1,p2,p;
L=Read();
L=Inverse(L);
Print(L);
return 0;
}
List Read(){
int m,n;
List L,head;
head = L = (List)malloc(sizeof(struct Node));
scanf("%d",&n);
for(int i=0;i<n;i++){
L->Next = (List)malloc(sizeof(struct Node));
scanf("%d",&(L->Next->Data));
L = L->Next;
}
return head;
}
void Print( List L ){
List p=L->Next;
while(p){
printf("%d", p->Data);
if(p->Next!=NULL){
printf(" ");
}
p=p->Next;
}
printf("\n");
}
List Inverse(List L){
List p, q,head;
head=L;
p = L -> Next;
L -> Next = NULL;
while(p != NULL){
q = p -> Next;
p -> Next = L -> Next;
L -> Next = p;
p = q;
}
return head;
}