(C语言实现)将给定单向链表逆置,即表头置为表尾,表尾置为表头。

(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;
}

样例运行结果截图:
在这里插入图片描述

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值