文章目录

  • 前言
  • 逆序
  • 指定范围逆序
  • 源码实现
前言

关于链表的逆置,是考察对链表指针的理解。知道了如何不实用额外空间,同时使用O(n)复杂度对链表进行逆序之后将会对链表有好理解。
同时关于如何在指定范围内对链表逆置同样可以进一步加深理解

逆序

基本过程如下:

  1. 保留原始链表的next指针域,p = head -> next
  2. 将原始链表的next指针域指向新链表的头部,head -> next = new_head
  3. 新链表指针向前移动一位,new_head = head
  4. 原始链表头指针向后移动一位,指向之前保留的原始指针的next域,head = p


···


以上过程实现如下:

Data *reverse(Data *head) {Data *new_head = NULL;while(head) {Data *p = head -> next;head -> next = new_head;new_head = head;head = p;}return new_head;
}
指定范围逆序

基本过程如下,指定链表的第2-4个节点进行逆序,其他节点保持原有顺序

这个过程需要关注如下几个关键节点

  1. 逆序前的头节点和逆序后的尾节点需要确认,确认之后在此范围即可进行如上过程的链表逆序
  2. 逆序完成之后需要连接头节点
  3. 逆序完成之后需要连接尾节点

实现过程如下:

/*指定范围,逆序m-n之间的节点*/
Data *reverse_betweenM_N(Data *head, int m, int n) {Data *result, new_tail;Data *new_head = NULL;Data *pre_head = NULL;/*计算需要逆序的节点个数,从而能够找到逆序的尾节点*/int change = n - m + 1;/*跳过m个节点,找到逆序前的第一个节点*/result = head;while(head && --m) {pre_head = head;head = head -> next;}/*保留逆序前的第一个节点,逆序后将变为尾节点*/Data *list_tail = head;/*逆序m-n之间的节点*/while(head && change) {Data *p = head -> next;head -> next = new_head;new_head = head;head = p;change --;}/*逆序完成之后,将逆序后的尾节点指向链表结尾*/list_tail -> next = head;/*确认逆序节点不是从链表头节点开始:如果是则最终头节点为逆序后的头节点否则将头节点指向逆序后的头节点,保持链表完成性*/if (pre_head) {pre_head -> next = new_head;result = pre_head;} else {result = new_head;}return result;
}
源码实现
#include <stdio.h>
#include <stdlib.h>/*链表数据域和指针域*/
typedef struct link_list {int data;struct link_list *next;
}Data;/*打印链表*/
void print_list(Data *head) {while (head) {printf("%d ",head->data);head = head -> next;}printf("\n");
}/*头插法创建链表*/
Data *insert_head(Data *head, int n) {head = (Data *)malloc (sizeof(Data));head -> next = NULL;int data;while(n --) {Data *p = (Data *)malloc(sizeof(Data));scanf("%d",&data);p -> data = data;p -> next = head -> next;head -> next = p;}return head;
}/*尾插法创建链表*/
Data *insert_tail(Data *head, int n) {head = (Data *)malloc(sizeof(Data));head -> next = NULL;Data *r = head;int data;while(n--) {Data *p = (Data *)malloc(sizeof(Data));scanf("%d", &data);p -> data = data;r -> next = p;r = p;p -> next = NULL;}return head;
}/*链表逆序*/
Data *reverse(Data *head) {Data *new_head = NULL;while(head) {Data *p = head -> next;head -> next = new_head;new_head = head;head = p;}return new_head;
}/*链表指定范围逆序*/
Data *reverse_betweenM_N(Data *head, int m, int n) {Data *result, new_tail;Data *new_head = NULL;Data *pre_head = NULL;int change = n - m + 1;result = head;while(head && --m) {pre_head = head;head = head -> next;}Data *list_tail = head;while(head && change) {Data *p = head -> next;head -> next = new_head;new_head = head;head = p;change --;}list_tail -> next = head;if (pre_head) {pre_head -> next = new_head;result = pre_head;} else {result = new_head;}return result;
}int main() {Data *head;printf("construct link list :\n");head = insert_tail(head,5);Data *test = reverse_betweenM_N(head -> next,2,4);printf("after reverse between 2-4:\n");print_list(test);Data *rever = reverse(head -> next);printf("after reverse :\n");print_list(rever);return 0;
}

输出如下:

construct link list :
1 2 3 4 5
after reverse between 2-4:
1 4 3 2 5
after reverse :
5 2 3 4 1

C语言的单链表逆序和指定范围逆序相关推荐

  1. c语言字符就地逆置,高手看看我的C语言代码单链表实现就地逆置

    高手看看我的C语言代码单链表实现就地逆置 单链表实现就地逆置#include #include struct type{ int date; struct type * next;}first;int ...

  2. Go语言-实现单链表反转算法

    Go语言实现链表的逆序_头插法 头插法与尾插法 头插法 概念 特点 核心过程 Go语言实现 ==注意==:上述方法是带头指针的头插法的实现,如果是带头节点的头插法需要做一定的修改 如果是带头节点的,则 ...

  3. C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)

    http://blog.csdn.net/xiaofeige567/article/details/27484137 C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表) ...

  4. c语言用链表实现成绩管理系统,C语言基于单链表得学生成绩管理系统

    前言 传说中讲课通俗而不庸俗,说话风流而不下流的小编又来了哦,今天的主要内容是:C语言基于单链表得学生成绩管理系统.首先给年夜家总结下为什么你们学习C语言会觉得难,尤其是对单链表这块,主要原因得是因为 ...

  5. c语言实现可变单链表,c语言实现单链表

    c语言实现单链表 c语言实现单链表 定义 创建 销毁 清空 打印 获取长度 查询 删除第pos个结点 在第pos插入结点 定义 首先来看一看单链表的定义(看看百度的) 单链表是一种链式存取的数据结构, ...

  6. TypeScript算法专题 - blog1.基于TypeScript语言的单链表实现

    TypeScript算法专题 - 基于TypeScript语言的单链表实现 李俊才 CSDN:jcLee95 邮箱:291148484@163.com 专题目录:https://blog.csdn.n ...

  7. C语言基于单链表的词典软件

    C语言基于单链表的词典软件 实验1: 日期:2022-10-4 类型:设计型 题目:基于单链表的词典软件 内容: 利用单链表存储词典,可以实现从文件中加载数据.查询单词.添加词条.删除词条.将词典保存 ...

  8. c语言实现单链表的创建(完整版)

    使用c语言实现单链表是考研的重点.但是如何实现却是一个难点.下面是我写的一个简单的创建单链表的代码. #include<stdio.h> #include<stdlib.h> ...

  9. java语言实现单链表---不含头结点

    java语言实现单链表---不含头结点 一.相关概念 1.什么是线性表 2.什么是顺序表 3.什么是链表 4.单链表.双链表.循环单链表.循环双链表 5.头结点和首结点 6.常见的栈和队列与线性表的关 ...

  10. C语言实现单链表基本操作

    C语言实现单链表基本操作的 目录

最新文章

  1. [YTU]_2630 ( E2 驾驭const)
  2. sas univariate 结果解释_PROC UNIVARIATE过程
  3. java map去重复的数据_使用HashMap去重复数据.
  4. 相离的圆(51Nod-1278)
  5. C语言使用函数参数传递中的省略号:va_list, va_start, va_arg, va_end
  6. Python生成器和类
  7. SPS中计算值公式函数简介
  8. UFO报表转换不成功!请检查文件版本或使用DOS文件转换工具
  9. 秩和比RSR法算法C语言,论文:应用EXCEL实现秩和比法的计算及其评价-中大网校论文网...
  10. 函数的length属性
  11. 新闻分析:微软到底需要雅虎什么?
  12. node-@hapi/joi校验前端数据
  13. wps/excel 正则表达式 提取数字
  14. ROS单线程与多线程处理
  15. UE4 C++ 动态读取图片
  16. 科技交流英语(2022秋)Unit 5 test
  17. 透视表中如何使用多条件中位数
  18. Android 自定义评论回复view
  19. 【基础入门题022】一元钱换成分币
  20. idea crlf是什么意思

热门文章

  1. ES6深入学习记录(一)class方法相关
  2. 数据库SQL优化大总结之百万级数据库优化方案
  3. Android学习 —— 数据的存储与访问方式一: 文件存取
  4. VC串口通信编程-2
  5. N-Case 律师事务所管理系统安装与卸载说明
  6. USACO Barn Repair
  7. github 思维导图开元软件_画思维导图记笔记的工具软件
  8. macos 全局快捷键 打开 iterm_MouseInc – 完全免费的全局鼠标手势增强工具 | 马小帮...
  9. input限制文字个数但是输入中文时会被切断_Python文字转换语音,让你的文字会「说话」抠脚大汉秒变撒娇萌妹...
  10. xshell连接不了服务器显示22端口,win10安装redis,xshell无法连接22端口