神奇的链子又来了。昨天对链表进行了基本的增/删/查/改操作,今天来一些链表更进阶的一些执行方法之反转链表。

第一种方法:熟悉的头插法

定义一个新的头指针 ---> 直接把结点依次摘下来 ---> 向新定义的头指针上进行头插。

至于为什么要头插呢?

链表头插就会把原来的结点顺序进行逆序。这就是本方法的最重要的原因。

OK代码如下:

//1.反转链表
//1.1引入一个头指针,进行头插的办法 *****
void ReversalLinkList_TouCha(LinkList* first)
{assert(first);LinkListNode* ptr = first->head;LinkListNode* ptrs;//标记移动结点的下一个结点LinkList* Two = (LinkList*)malloc(sizeof(LinkList));InitLinkList(Two);while (ptr != NULL){ptrs = ptr->next;if (Two->head != NULL){ptr->next = Two->head;Two->head =ptr;}else{Two->head = ptr;ptr->next = NULL;}ptr = ptrs;}first->head = Two->head;
}

第二种方法就是三指针法

所谓三指针法:就是用三个指针依次去指向链表的前三个结点(注意只要有两个及两个以上结点就可以使用),要对没有结点和只有一个节点另外进行判定及相应的处理。接下来就是交换前两个结点,之后把三个指针依次向后移动。直到只有一个结点停止。

为什么会用三指针?

这是因为对该链表进行逆转时,是直接在该链表上进行修改,单链表我们可以很容易想到一个指针是完成不了的,因为他只能找到下一个结点,而对前面结点却束手无策,所以引入第二个指针标记前一个结点,就可以进行交换,但只用两个,那么就会存在一个问题。交换的结点的后一个结点将无法找到。因为它的前一个结点已经变成了交换的结点的第一个。所以必须引用第三个指针来标记交换的结点的后一个结点。

OK代码如下:

//1.2引入三个指针,改变指向的办法
void ReversalLinkList_ThreePoint(LinkList* first)
{assert(first);LinkListNode* ptr0;LinkListNode* ptr1;LinkListNode* ptr2;LinkListNode* ptr = first->head;if ((first->head == NULL) || (ptr->next == NULL)){return;}ptr0 = ptr;ptr1 = ptr->next;ptr2 = ptr->next->next;int i = 0;while (ptr1 != NULL){if (i==0){i++;ptr0->next = NULL;}ptr1->next = ptr0;first->head = ptr1;//移动指针ptr0 = ptr1;ptr1 = ptr2;if (ptr1 != NULL){ptr2 = ptr2->next;}}
}

两次的运行结果:

6 5 4 3 2 1  //原链表
1 2 3 4 5 6  //第一种方法
6 5 4 3 2 1  //第二种方法
请按任意键继续. . .

珍&源码

初夏小谈:反转单链表(头插法、三指针法)相关推荐

  1. 不带头结点建立单链表(头插法、尾插法)

    #include<iostream> using namespace std; #include<stdlib.h> typedef int ElemType; typedef ...

  2. 王道代码版单链表头插法,不带头的头插法,尾插法,不带头的尾插法的总结

    在编译器上面编译发现很容易控制台打印不出来,这可能就是细节所在,但是网上也没有很全的全代码输出的案例.我做题的感觉写的是对的其实并不对,你只是第六感感觉是对的仅此而已!!!要注意引以为戒,下面总结一下 ...

  3. C语言实现单链表头插法

    //链表结构 //a是数据域 //node是指针域 //typedef是结构体简化语句 //node用于后面初始化空间的时候取结构体的占用空间大小 //listnode是整个链表的头指针指向,即指向链 ...

  4. 单链表头插法与尾插法的c语言实现(回顾)

    #include<stdio.h> #include<math.h> #include<stdlib.h> typedef struct node{int data ...

  5. 链表反转的四种方法(栈、头插法、三指针法、递归法)

    单链表反转或转置的四种方法 链表的反转实质上是反转链表上的内容: 若链表存储的数据是:1->2->3->4->5; 那么反转后则是:5->4->3->2-&g ...

  6. 反转单链表(三种方法)(三指针法)(头插法)(递归)经典面试题

    剑指 Offer 24. 反转链表 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点. 示例: 输入: 1->2->3->4->5->NULL 输出 ...

  7. lcg_magic算法笔记:反转单链表

    文章目录 1. 题目 2. 无头结点的单链表 2.1. 原始单链表 2.2. 反转过程 2.3. 代码 2.4. 结果 2.5. Github 3. 带头结点的单链表 3.1. 初始单链表 3.2. ...

  8. 数据结构 - 反转单链表(C++)

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! // 反 ...

  9. python怎么反转单链表_单链表反转python实现代码示例

    单链表的反转可以使用循环,也可以使用递归的方式 1.循环反转单链表 循环的方法中,使用pre指向前一个结点,cur指向当前结点,每次把cur->next指向pre即可. 代码: class Li ...

最新文章

  1. (.DS_Store)避免多人提交代码到GitHub上起冲突
  2. 《javascript高级程序设计》笔记:变量对象与预解析
  3. 设计模式-UML图简单介绍
  4. kubesphere添加新节点
  5. c++运算符和结合性
  6. Java 获取当前项目的类路径
  7. Sereja and Brackets CodeForces - 380C (树状数组+离线)
  8. 现金贷平台倒闭后,借的钱是否可以不还?
  9. 【英语学习】【WOTD】magniloquent 释义/词源/示例
  10. js制作带有遮罩弹出层实现登录小窗口
  11. 电路实验一阶电路误差分析_逆变器电路原理分析
  12. Java的throws Exception
  13. 基于javaweb房屋租赁系统设计与实现
  14. 用【快剪辑】给视频打马赛克
  15. python实现t分布
  16. 计算机操作系统出现死锁的原因
  17. threejs 三次贝塞尔曲线
  18. space-around space-evenly区别
  19. 流媒体服务器原理和架构解析
  20. android 蓝牙打印兼容,在Android中使用蓝牙打印机打印不起作用

热门文章

  1. Excel+Access做数据分析和报表分析
  2. 核心动画(14)图像IO
  3. 微信小程序scroll-view重新加载数据,滚动条回到顶部
  4. 比较购买汽车音响系统
  5. 使用Advanced Installer 打包Revit插件
  6. 邮政国际小包裹丢失要怎么处理
  7. php编程json,php字符转json对象的方法
  8. Xtrabackup备份
  9. 4Cr13高硬度1.4031高耐磨性X39Cr13不锈钢材料
  10. Ubuntu 增加swap分区