题目要求概述
反向链表
Write a nonrecursive procedure to reverse a singly linked list in O(N) time using constant extra space.
List定义如下:
typedef struct Node *PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position;
struct Node {
ElementType Element;
Position Next;
};
函数接口如下:
List Reverse( List L );
The function is supposed to return the reverse linked list of , with a dummy header.Reverse
L
裁判程序如下:
#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
题目理解与分析
题目要求写的是非递归函数,且时间复杂度为O(N),我们姑且可以理解为通过迭代实现。函数传入的是链表 List 的指针 L,要求返回的是反向后链表的指针(带有一个虚拟的头指针)。
Output里会出现两次反向后的链表也很好理解。从主函数可以看到分别 Print 了 L1、L2,其中 L1 是原链表,L2 是反向链表。之所以这么输出我认为就是为了体现传进去的是指针,所以原链表也被反向了。
解答
代码如下:
List Reverse (List L) {
List head = L->Next;
// L指向第一个结点
if (head == NULL || head->Next == NULL)
return L;
// L为空或只有一个结点,不需要进行操作
List pre, post;
pre = NULL;
while (head != NULL) {
post = head->Next;
head->Next = pre;
pre = head;
head = post;
}
return pre;
}
对于最后while循环中的操作,为了便于理解,我画了大概的示意图:
多次循环后,最终停止在下面的状态:
此时直接返回pre即可。
PS:该答案是我在原答案基础上改进得到的,并未经过裁判程序测试,故不保证正确性。