本题要求,将给定单向链表逆置,即表头置为表尾,表尾置为表头。
链表结点定义如下:
解释
struct ListNode { int data; struct ListNode *next; };
函数接口定义:
在这里描述函数接口。例如:
struct ListNode *create();
struct ListNode *inverse(struct ListNode *head); //链表的逆置
其中head是用户传入的链表的头指针;函数reverse将链表head逆置,并返回结果链表的头指针。
裁判测试程序样例:
解释
#include <stdio.h> #include <stdlib.h> struct ListNode { int data; struct ListNode *next; }; struct ListNode *create(); struct ListNode *inverse(struct ListNode *head); //链表的逆置 int main() { struct ListNode *p, *head = NULL; head = create(); if(head==NULL) printf("no data!"); else { head=inverse(head); for ( p = head; p != NULL; p = p->next ) printf("%d ", p->data); } printf("\n"); return 0; } /* 你的代码将被嵌在这里 */
输入样例1:
1 2 3 4 5 6 -1
输出样例1:
6 5 4 3 2 1
输入样例2:
-1
输出样例2:
no data!
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
struct ListNode *create()
{
struct ListNode *p1,*p2,*head;
int n=0;
int x;
p1=p2=(struct ListNode *)malloc(sizeof(struct ListNode));
scanf("%d",&x);
p1->data=x;
head=NULL;
while(p1->data!=-1)
{
n=n+1;
if(n==1)
head=p1;
else
p2->next=p1;
p2=p1;
p1=(struct ListNode *)malloc(sizeof(struct ListNode));
scanf("%d",&x);
p1->data=x;
}
p2->next=NULL;
return(head);
}
struct ListNode *inverse(struct ListNode *head)
{
if(head==NULL)
return NULL;
if(head->next==NULL)
return head;
struct ListNode *p=head;
struct ListNode *q=NULL;
struct ListNode *r=NULL;
while(1)
{
if(q==NULL)
{
q=p;
r=p->next;
q->next=NULL;
}
else
{
r=p->next;
p->next=q;
}
q=p;
p=r;
if(p->next==NULL)
{
p->next=q;
break;
}
}
return p;
}