分数 20
作者 陈越
单位 浙江大学
Write a nonrecursive procedure to reverse a singly linked list in O(N) time using constant extra space.
Format of functions:
cs
List Reverse( List L );
where List
is defined as the following:
cs
typedef struct Node *PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position;
struct Node {
ElementType Element;
Position Next;
};
The function Reverse
is supposed to return the reverse linked list of L
, with a dummy header.
Sample program of judge:
cs
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct Node *PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position;
struct Node {
ElementType Element;
Position Next;
};
List Read(); /* details omitted */
void Print( List L ); /* details omitted */
List Reverse( List L );
int main()
{
List L1, L2;
L1 = Read();
L2 = Reverse(L1);
Print(L1);
Print(L2);
return 0;
}
/* Your function will be put here */
Sample Input:
5
1 3 4 5 2
Sample Output:
2 5 4 3 1
2 5 4 3 1
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
解题思路如下:
1.首先判断该单链表是否为空链表若为空则直接返回改链表
2.若不为空,则创建两个指针beg和end,一个指向原单链表的第一个数据结点,一个指向第一个数据结点的下一个结点。
3.接下来进行四个步骤的循环:
第一步:连(防止断链找不到下一个结点),将beg的Next域指针指向end的Next域指针所指向的结点,那么beg的Next域指向end结点的链将断掉。
第二步:调,将end的Next域指向L的头结点所指向的结点。
第三步:接,将新的第一个数据节点的地址保存在原来的头结点中
第四步:移,将end指针移动到beg的Next指针域指向的结点
具体代码如下:
cs
List Reverse(List L) {
if(L == NULL || L ->Next == NULL){
return L;//如果链表为空则直接返回该链表
}
List beg,end;//创建两个指针
beg = L->Next;//一个指向单链表的头结点
end = beg->Next;//一个指向头结点里Next域所指向的结点
while(end != NULL){//循环条件为end不为空
beg ->Next = end->Next;//第一步链接
end->Next = L->Next;//第二步断链、调转
L->Next = end;//第三步改变链接新的数据结点
end = beg->Next;//第四步移动指针到新的结点
}
return L;
}