文章中提到的代码模板可参考《简明数据结构》期末备考之链表专题
试题描述
给定一个单链表L1->L2->...->Ln-1->Ln,请编写程序将链表重新排列为L3->...->Ln->L1->L2。
样例输入
1 2 3 4 5 6
样例输出
3 4 5 6 1 2
语言
C
OJ提交结果
KLP平台编译运行通过,答案正确。
思路分析
套用尾插法建立带头结点的单链表模板
//尾插法建立带头结点的单链表
LinkList CreateFromTail() /*将新增的字符追加到链表的末尾*/
{
LinkList L;
Node *r, *s;
int flag = 1;
L = (Node *)malloc(sizeof(Node)); /*为头结点分配存储空间*/
L->next = NULL;
r = L; /*r指针始终动态指向链表的当前表尾*/
while(flag) /*标志,初值为1。输入"$"时flag为0,链表结束*/
{
char c = getchar();
if(c != '$')
{
s = (Node *)malloc(sizeof(Node));
s->data = c;
r->next = s;
r = s;
}
else
{
flag = 0;
r->next = NULL;
}
}
return L;
}
本题为防止时间超限,采用scanf("%d",&x)!=EOF的读入判断。
源代码
#include<stdio.h>
#include<malloc.h>
#define ElemType int
typedef struct Node{
ElemType data;
struct Node *next;
}Node ,*LinkList;
LinkList CreateFromTail()
{
LinkList L;
int x ;
L = (Node *)malloc(sizeof(Node));
L->next = NULL;
Node *r, *s;
int flag = 1;
r = L;
while(scanf("%d",&x)!=EOF)
{
s = (Node *)malloc(sizeof(Node));
s->data = x;
r->next = s;
r = s;
}
r->next = NULL;
return L;
}
void PrintLinkList(LinkList L)
{
Node *r = L->next;
while(r != NULL)
{
printf("%d ",r->data);
r = r->next;
}
}
LinkList ReverseLinkList(LinkList L)
{
Node *p1, *p2, *p3;
p1 = (Node *)malloc(sizeof(Node));
p2 = (Node *)malloc(sizeof(Node));
p3 = (Node *)malloc(sizeof(Node));
p1 = L->next;
p2 = p1->next;
p3 = p2->next;
L->next = p3;
while(p3->next != NULL)
{
p3 = p3->next;
}
p3->next = p1;
p1->next = p2;
p2->next = NULL;
return L;
}
int main()
{
LinkList L1 = CreateFromTail();
LinkList L2 = ReverseLinkList(L1);
PrintLinkList(L2);
return 0;
}