主函数定义一个链表,储存控制台输入的n个整数;然后编写函数:

1.create函数,储存信息

2.reverse(head),将链表逆序,即原链表的头节点成为新链表的尾节点;原链表的尾节点成为新链表的头节点;

3.print函数,打印信息

输入样例:

5
1 2 3 4 5

输出样例:

1 2 3 4 5
5 4 3 2 1 

代码如下:

 方法一:创建一个新链表,先将旧链表的 head 作为新链表的 phead ,再将旧链表的 head 后移,依次将后一个 head 作为新链表的 phead ,直到 head -> next 为 NULL (开辟了新的内存空间)

#include<stdio.h>
#include<stdlib.h>struct node
{int data;struct node *next;
};struct node *create(int n)//创建链表
{struct node *head,*pnew,*ptail;int i;pnew=(struct node *)malloc(sizeof(struct node));scanf("%d",&pnew->data);head=pnew;ptail=pnew;for(i=1;i<n;i++){pnew=(struct node *)malloc(sizeof(struct node));scanf("%d",&pnew->data);ptail->next=pnew;ptail=pnew;}//forptail->next=NULL;return head;
}//createstruct node *reverse(struct node *head)
{struct node *pnew,*phead;pnew = (struct node *)malloc(sizeof(struct node));*pnew = *head;//进行拷贝phead = pnew;//将新链表的头节点指向pnewphead -> next = NULL;//第一个头作为新链表的尾节点while(head -> next != NULL){//将后面的节点依次插入在头节点前面pnew = (struct node *)malloc(sizeof(struct node));head = head -> next;*pnew = *head;pnew -> next = phead;phead = pnew;}//whilereturn phead;}//reversevoid print(struct node *head)//输出链表信息
{struct node *p=head;while(p!=NULL){printf("%d ",p->data);p=p->next;}//while
}//printint main()
{struct node *head;int n;scanf("%d",&n);head=create(n);//调用函数创建链表print(head);printf("\n");printf("逆序后前链表的节点信息为:\n");head=reverse(head);//调用函数实现链表逆序print(head);return 0;
}

方法二:不开辟新的空间

#include<stdio.h>
#include<stdlib.h>struct link{int data;struct link *next;
};struct link *reverse(struct link *head)//实现链表逆序
{struct link *new_head,*p=head->next ;new_head=(struct link*)malloc(sizeof(struct link));//创建一个新的头节点new_head->next=NULL;//新的头节点指向NULLwhile(p!=NULL)//使用头插法实现逆序{head=p->next;//将要逆序链表的头节点后移p->next=new_head->next;//将p的next指向新头节点的nextnew_head->next=p;//将p插入到新头节点的后面p=head;//重新将p指向head}free(head);//释放旧的头节点return new_head;//返回新的头节点
}struct link *create(int n)//创建链表
{struct link *head,*pnew,*ptail;int i;head=(struct link *)malloc(sizeof(struct link));//头节点不存储数据pnew=(struct link *)malloc(sizeof(struct link));scanf("%d",&pnew->data);head->next=pnew;ptail=pnew;for(i=1;i<n;i++){pnew=(struct link *)malloc(sizeof(struct link));scanf("%d",&pnew->data);ptail->next=pnew;ptail=pnew;}ptail->next=NULL;return head;
}void print(struct link *head)//输出链表信息
{struct link *p=head->next;while(p!=NULL){printf("%3d",p->data);p=p->next;}printf("\n");
}int main()
{struct link *create(int n);//声明创建链表函数struct link *reverse(struct link *head);//声明链表逆序函数void print(struct link *head);//声明输出链表信息函数struct link *head;int n;printf("请输入节点的个数:\n");scanf("%d",&n);while(n==0){printf("无法创建链表!请重新输入n\n");scanf("%d",&n);}printf("请输入这些节点的信息:\n");head=create(n);//调用函数创建链表printf("逆序前链表的节点信息为:\n");print(head);printf("逆序后前链表的节点信息为:\n");head=reverse(head);//调用函数实现链表逆序print(head);return 0;
}

链表逆序(拷贝和插入)相关推荐

  1. c语言将一个已知头结点的单链表逆序_C语言数据结构实现链表逆序并输出

    C语言数据结构实现链表逆序并输出 将一个链表逆序并输出.我用了两种方法来实现,第一种是借助了一个新的空链表:第二种是在原来链表的基础上直接实现逆序. 实例代码: 头文件: #include #incl ...

  2. 链表的各种操作实现 链表逆序 链表排序 有序链表归并 链表存在环的判定

    链表的各种操作实现 链表逆序 链表排序 有序链表归并 链表存在环的判定 链表基本操作实现 c语言版本, 该程序在visual c++ 6.0上调试通过! 本人写该程序完全是为学习交流之用,还望大家多多 ...

  3. c语言单链表_C语言笔试题—单链表逆序

    前情回顾 之前更多的是给大家推荐的是好用的软件,经过反思之后觉得这些东西并不是我想要的,所以从今天开始我要转变方向了,更多的往我的专业方向去发展(虽然我是个小白),当然如果有说的不对的地方,希望大家能 ...

  4. 自定义链表增,删除,链表逆序

    工作时间长了,经常用框架,感觉真的成了coding,建议有时间可以刷一下lettcode 时间一长就会忘,写了大半天,记录一下,理解后再写特别简单,链表逆序看了很多博客,写法各式各样,但是感觉解释的还 ...

  5. C++实现链表逆序打印、链表反转

    //题目:C++实现链表逆序打印.链表反转 // 如何将链表逆序,取决于题目的要求.如果面试官只要求打印,一般不改动链表结构为好,如果要求改变链表的方向,则需要改变结构,再顺序打印. // 方法1:只 ...

  6. 简单算法 - 链表逆序思路详解

    1.1.1            链表逆序 1.1.1.1           思路 如A->B->C->D->E 一般会有以下两种思路,如下 思路一: 先取出链表的最后一个E ...

  7. 链表详解(单链表、双向链表、链表逆序)

    目录 线性表 顺序存储结构 链式存储结构 单链表 单链表定义 单链表基本操作(仅供参考) 实例 循环单链表的状态图 双向链表 双向链表定义 双向链表特点 双向链表基本操作(仅供参考) 实例 双向链表的 ...

  8. C++ Python 链表逆序 反转链表

    ** 以下为C++版本 ** 已知链表头节点指针head,将链表逆序.(不可申请额外空间) #include<stdio.h> struct ListNode {int val; //数据 ...

  9. 【链表】C++链表反转、链表逆序打印

    转载地址:http://blog.csdn.net/yebanxin/article/details/51942598 题目:C++实现链表逆序打印.链表反转 如何将链表逆序,取决于题目的要求.如果面 ...

最新文章

  1. 飞行时间(TOF)相机优缺点及其应用领域
  2. 组合查询——怎样使用窗口的继承达到事半功倍?
  3. php获取date前1分钟hour,php时间轴函数,刚、1分钟前、1小时前、一天前
  4. hbase delete.deleteColumns问题
  5. DW Question Answer Pro 1.3.4 DWQA问答系统插件
  6. arduino 土壤温湿度传感器_【雕爷学编程】Arduino动手做(70)---土壤湿度传感器...
  7. vuejs路由插件:vue-router的工作原理
  8. gem install 和 bundle 区别
  9. ffmpeg基本知识
  10. “中国创业第一书”签售会将在蓉城举行(转)
  11. java电子书下载网站
  12. 软件项目解决方案模板
  13. oracle查询第二个字为a,Oracle中SQL语句学习二(like,转义,order by)
  14. i7 9750h和i7 8750h参数对比差多少
  15. 微信网页授权流程 时序图
  16. Word 分节设置不同起始页码
  17. 百度SEM/SEO关键词批量自动分词工具
  18. PHP-简单的留言薄功能
  19. Wifidog扫盲篇
  20. 计算机网络提供给用户的常见服务有文件服务,【填空题】计算机网络提供给用户的常见服务主要有文件服务、消息传递服务、__________服务和应用服务。...

热门文章

  1. unpacking of archive failed: cpio: lstat failed - Not a directory
  2. SpringBoot#InitBinder
  3. java面试---数据库之数据库优化及mycat分库分表
  4. RHEL6.5和RHEL7 的区别(转)
  5. 多边形颜色填充-X扫描线算法
  6. centos基本命令
  7. perl与c相互调用
  8. execute、executeQuery、executeUpdate的用途及返回值
  9. CAS详解,如何理解CAS!
  10. 好不容易找到工作,还给期权,要去吗?