(C语言实现)将给定单向链表逆置,即表头置为表尾,表尾置为表头。
输入格式:
输入在若干个整数,以-1结尾。
输出格式:
输出逆置之后的单链表的元素值,以“ ”空格分隔。
输入样例:
1 2 3 4 5 6 -1
输出样例:
6 5 4 3 2 1
转置过程
1.设置指向原链表的指针p
2.新建一个链表,将原链表的节点从头开始插入新链表的表头,从实现链表转置
3. 生成一个新节点q,将原链表的表头的值赋给q(q->data=p->data);
4. 然后将这个节点q插入到新链表的表头(q->next=head1;head1=q);
5. 然后将指针p指向原链表下一个节点(p=p->next),直到原链表结束(p=NULL)
伪代码:
while(p!=NULL){
q=(node *)malloc(sizeof(node));//申请空间
q->data=p->data;//将节点值赋给q
q->next=head1;
head1=q;
p=p->next;
}
#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct ListNode {
datatype data;
struct ListNode *next;
}node;
node *createlist(); /*单链表创建*/
node *reverse( node *head );//单链表转置
void printlist(node *head ); /*单链表输出*/
int main()
{
node *head;
head = createlist();
head = reverse(head);
printlist(head);
return 0;
}
node * createlist()
{
node *head,*r,*s;
datatype x;
head=r=NULL;
scanf("%d",&x);
while (x!=-1) /*以-1结束输入*/
{ s=(node *)malloc(sizeof(node));
s->data=x;
if (head==NULL) /*将新结点插入到链表最后面*/
head=s;
else
r->next=s;
r=s;
scanf("%d",&x);
}
if (r) r->next=NULL;
return head; /*返回建立的单链表*/
}
void printlist(node *head )
{
node *p = head;
if (p==NULL) printf("-1");
else
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
node *reverse( node *head ){
//创建一个新链表,每次都将要转置链表的头插入新的链表
node *head1=NULL;
int x;
node *p,*q;//工作指针q
p=head;//工作指针p,指向要进行插入新链表的节点
while(p!=NULL){//设定一个头指针
q=(node *)malloc(sizeof(node));//申请空间
q->data=p->data;//将节点值赋给q
q->next=head1;
head1=q;
p=p->next;
//printf("%d ",q->data);//验证每次插入数据是否正确
}
return head1;
}
样例运行结果截图: