主函数定义一个链表,储存控制台输入的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. 多级反馈队列列算法的优点
  2. 虚拟网卡与物理网卡TCP协议数据传输对比
  3. DataSet case sensitive issue
  4. try not do unnecessary subscriptions
  5. 一个IT青年北漂四年的感悟
  6. java 在线编辑器_最好的Markdown开源在线编辑器,没有之一!
  7. 剑指offer--二维数组的查找
  8. poj 1269 直线相交情况
  9. 调研了10家公司的技术架构,我总结出了一套大数据平台的套路
  10. Python打印某范围内的素数
  11. 《深入浅出MFC》学习笔记
  12. PowerShell 中执行 dir /b /s
  13. To C、To G、To B,数字化转型
  14. 学习PLC到底要不要买PLC?
  15. 图书管理系统E-R图转关系图
  16. 文档服务器 件排名,服务器十大品牌排名
  17. 一起来找:程序员必去的社区与网站
  18. PRISM 下载安装
  19. java 重启路由器
  20. sqlserver dba

热门文章

  1. matlab中三角函数sin、cos、tan以弧度为单位
  2. 计算机方面的文献在哪里找,最新浅谈计算机参考文献 浅谈计算机专著类参考文献哪里找...
  3. Mybatis中Collection集合标签的使用
  4. Linux 中 vim编辑器如何跳转到指定的列、如何跳转到行首或者行尾、左右跳转
  5. LeetCode 最长公共子串
  6. 服务降级(服务回退)
  7. 物体检测之SNIPER
  8. 3.5mm耳机、麦克风的插座、插头定义
  9. xmind 使用详解
  10. Android读取联系人的姓名及电话号码