1.1.1            链表逆序

1.1.1.1           思路

如A->B->C->D->E

一般会有以下两种思路,如下

思路一:

先取出链表的最后一个E,然后将E作为新链表的头,

现在状态为

原始链表:A->B->C->D

新链表:E

再取出原来链表的最后一个D,然后将D插入到新链表的最后位置,

现在状态为

原始链表:A->B->C

新链表:E->D

依次类推,最后形成E->D->C->B->A

很显然,这个算法的复杂度为O(n2)。

思路二:

取出原始链表的第一个节点A,然后将该节点作为新链表的头节点。

现在状态为

原始链表:B->C->D->E

新链表:A

然后同上,变为了下面的状态

原始链表:C->D->E

新链表: B->A

原始链表:D->E

新链表: C->B->A

原始链表:E

新链表: D->C->B->A

原始链表:

新链表: E->D->C->B->A

很显然,对原始链表遍历一次,就完成了这个工作,所以这个算法的复杂度为O(n)。

1.1.1.2           程序思路

对思路二进行程序设计。

通过对上面状态的变化分析,只要我们知道原始链表和新链表的头节点,我们就可以从原始链表取出第一个节点,然后将节点插入到新链表的第一个位置,由于两个链表的头结点现在都已经变化,所以我们不能丢失新头节点的地址。所以,我们要设置两个变量分别记录两个链表的头结点。下面程序中的old_head和 new_head分别表示原始链表的头节点和新链表的头节点。

程序如下,实现了迭代方式和递归方式:

/*** Introduction : reverse list* Author : Gykimo* Date : 20121212**/#include <stdio.h>
#include <malloc.h>typedef struct Node{int data;struct Node* next;
}Node;#define LIST_LEN     10     //链表长度
Node * List = NULL;          //链表//迭代方式
void reverse_ite(Node * list){Node * old_head = NULL;         //原来链表的头Node * new_head = NULL;      //新链表的头Node * cur = list;      //获得原来链表的头//每次将原来链表的头取出,并插入到新链表中,并且是新链表的头while(cur != NULL){old_head = cur->next;      //将原来链表的头取出,并将第二个节点作为头节点cur->next = new_head;   //将取出的头设为新链表的头new_head = cur;      //新链表的头就是目前新链表的头cur = old_head;        //接着处理}List = new_head;
}//递归方式
void reverse_recursive(Node * old_head, Node * new_head){if(old_head == NULL){List = new_head;return;}Node * tmp = old_head->next;        //将原来链表的头取出,并将第二个节点作为原来链表的头节点用于下一层递归old_head->next = new_head; //将取出的头设为新链表的头reverse_recursive(tmp, old_head);         //接着处理
}//生成链表
void make_list(){List = (Node *)malloc(sizeof(Node) * LIST_LEN);int i = 0;for(i = 0; i < (LIST_LEN - 1); i++){(List + i)->data = i + 1;(List + i)->next = List + i + 1;}(List + LIST_LEN - 1)->data = LIST_LEN;(List + LIST_LEN - 1)->next = NULL;
}//打印俩表的data
void print_list(){Node * cur = List;while(cur!=NULL){printf("%d ", cur->data);cur = cur->next;}printf("\n");
}int main(){make_list();print_list();reverse_ite(List);     //迭代方式//reverse_recursive(List, NULL);     //递归方式print_list();
}

简单算法 - 链表逆序思路详解相关推荐

  1. c语言字符串正序反序连接输出,C语言中字符串实现正序与逆序实例详解

    C语言中字符串实现逆序实例详解 字符串逆序和正序的实现代码: #include #include #include #include #include /*定义*/ typedef struct no ...

  2. 【数据结构】单链表逆置的详解

    单链表的逆置 将单链表逆置: 定义一个前指针和一个后指针用来辅助工作指针 //头文件 #ifndef LINKLIST_H_INCLUDED #define LINKLIST_H_INCLUDEDst ...

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

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

  4. c语言实现单链表逆序算法,C语言解字符串逆序和单向链表逆序问题的代码示例...

    字符串逆序上次面试碰到一个单向链表逆序的题目,幸好对字符串逆序比较熟悉,类比做出来了.字符串逆序比较简单,直接上代码: void stringReverse(char* p1,char* p2) { ...

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

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

  6. 循环嵌套思路详解 | 一个“在盒子里过家家”的算法 -- 以冒泡排序与打印菱形为例

    目录 前言 一.引例 -- 菱形打印 1. 题干要求 2. 如何阅读循环结构? 二."在盒子里过家家"的理解思路 1. 什么叫"在盒子里过家家"? 一个小例子 ...

  7. java实现爬山算法_python实现爬山算法的思路详解

    问题 找图中函数在区间[5,8]的最大值 重点思路 爬山算法会收敛到局部最优,解决办法是初始值在定义域上随机取乱数100次,总不可能100次都那么倒霉. 实现 import numpy as np i ...

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

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

  9. 数据结构:链表逆序输出

    数据结构(一):链表逆序输出 题目描述:创建一个链表,并将链表逆序输出,链表中以输入0作为结束 关键代码详解: 附:全部代码 #include<stdio.h> #include<s ...

最新文章

  1. 收藏 | 数据分析师最常用的10个机器学习算法!
  2. 【HTML5CSS3进阶学习02】Header的实现·CSS中的布局
  3. CRM WebClient UI outbound plug的使用
  4. windows redis批量删除前缀的key_阿里官方Redis开发规范!
  5. leetcode 的shell部分4道题整理
  6. centos6.5安装bugzilla超详细教程
  7. mysql 二进制日志大小_mysql二进制日志。
  8. 浅论 C++ 的复杂性
  9. tcp 四次挥手_TCP三次握手,四次挥手,你真的懂吗?
  10. python打印字符串所在行_python打印文件中某个字符串的前几行
  11. 数据可视化大屏真不是个事,这 30 个精美的模板拿走吧
  12. 人工智能学习资料之2021图灵大会笔记
  13. [《岛鼠》闲笔记事集]2012年8月28日
  14. 9.后缀、前缀函数-suffix basename addsuffix addprefix
  15. html5 sketchpad,Sketchpad:基于html5在线图像绘画板
  16. 微信小程序 使用map组件 地图获取位置、移动选点、逆地址解析
  17. ubuntu: 查看cuda版本
  18. 思考之——java为什么不能多继承
  19. 别人看我真威风,我羡别人好轻松
  20. 微信小程序调用科大讯飞 在线合成语音接口(文字转语音)

热门文章

  1. mysql error unpacking_error: unpacking of archive failed on file错误的解决
  2. 《Head First Java (中文第二版)》勘误
  3. C++中的getline()函数
  4. AD常用使用快捷键和技巧
  5. 进入centos命令行的方式
  6. msp fet430uif驱动
  7. UiPath是做什么的
  8. 学计算机用商用本,开学装机,笔记本电脑市场解析及购机推荐
  9. EOS智能合约开发系列(六): eosio.token
  10. Spring源码学习(三)-- 底层架构核心概念解析