一.链表逆置
本题要求实现一个函数,将给定单向链表逆置,即表头置为表尾,表尾置为表头
裁判测试程序样例
#include <stdio.h>
#include <stdlib.h>struct ListNode {
int data;
struct ListNode *next; };struct ListNode *createlist(); /裁判实现,细节不表/ struct ListNode *reverse(
struct ListNode *head ); void printlist( struct ListNode *head ) {
struct ListNode *p = head;
while § {
printf("%d “, p->data);
p = p->next;
}
printf(”\n"); }int main() {
struct ListNode *head;
head = createlist();
head = reverse(head);
printlist(head);
return 0; }/* 你的代码将被嵌在这里 */
函数接口定义: struct ListNode *reverse( struct ListNode *head);
其中head是用户传入的链表的头指针;函数reverse将链表head逆置,并返回结果链表的头指针。
struct ListNode *reverse( struct ListNode *head )
{
int a[10000],len=0,i;
struct ListNode *head1=NULL,*end1=NULL;
struct ListNode *temp=head;
while(temp!=NULL)
{
a[len]=temp->data;
temp=temp->next;
len++;
}
for(i=0;i<len;i++ )
{
struct ListNode *p=(struct ListNode *)malloc(sizeof(struct ListNode));
p->data=a[i];
p->next=head1;
head1=p;
}
return head1;
}
二,逆序数据建立链表
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int data;
struct ListNode *next;
};
struct ListNode *createlist();
int main()
{
struct ListNode *p, *head = NULL;
head = createlist();
for ( p = head; p != NULL; p = p->next )
printf("%d “, p->data);
printf(”\n");
return 0;
}
struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2)
{
int a[1000],i=0,j,k,t;
struct ListNode *p1=list1,*p2=list2,*temp;
struct ListNode *head=NULL,*end=NULL;
while(p1!=NULL)
{
a[i]=p1->data;
p1=p1->next;
i++;
}
while(p2!=NULL)
{
a[i]=p2->data;
p2=p2->next;
i++;
}
for(j=0;j<i-1;j++)
{
for(k=j+1;k<i;k++)
{
if(a[j]>a[k])
{
t=a[j];
a[j]=a[k];
a[k]=t;
}
}
}
for(j=0;j<i;j++)
{
temp=(struct ListNode*)malloc(sizeof(struct ListNode));
temp->data=a[j];
if(head==NULL)
{
head=temp;
end=temp;
head->next=NULL;
}
if(end!=NULL)
{
end->next=temp;
end=temp;
}
end->next=NULL;
}
return head;
}