初夏小谈:反转单链表(头插法、三指针法)
神奇的链子又来了。昨天对链表进行了基本的增/删/查/改操作,今天来一些链表更进阶的一些执行方法之反转链表。
第一种方法:熟悉的头插法
定义一个新的头指针 ---> 直接把结点依次摘下来 ---> 向新定义的头指针上进行头插。
至于为什么要头插呢?
链表头插就会把原来的结点顺序进行逆序。这就是本方法的最重要的原因。
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 //第二种方法
请按任意键继续. . .珍&源码
初夏小谈:反转单链表(头插法、三指针法)相关推荐
- 不带头结点建立单链表(头插法、尾插法)
#include<iostream> using namespace std; #include<stdlib.h> typedef int ElemType; typedef ...
- 王道代码版单链表头插法,不带头的头插法,尾插法,不带头的尾插法的总结
在编译器上面编译发现很容易控制台打印不出来,这可能就是细节所在,但是网上也没有很全的全代码输出的案例.我做题的感觉写的是对的其实并不对,你只是第六感感觉是对的仅此而已!!!要注意引以为戒,下面总结一下 ...
- C语言实现单链表头插法
//链表结构 //a是数据域 //node是指针域 //typedef是结构体简化语句 //node用于后面初始化空间的时候取结构体的占用空间大小 //listnode是整个链表的头指针指向,即指向链 ...
- 单链表头插法与尾插法的c语言实现(回顾)
#include<stdio.h> #include<math.h> #include<stdlib.h> typedef struct node{int data ...
- 链表反转的四种方法(栈、头插法、三指针法、递归法)
单链表反转或转置的四种方法 链表的反转实质上是反转链表上的内容: 若链表存储的数据是:1->2->3->4->5; 那么反转后则是:5->4->3->2-&g ...
- 反转单链表(三种方法)(三指针法)(头插法)(递归)经典面试题
剑指 Offer 24. 反转链表 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点. 示例: 输入: 1->2->3->4->5->NULL 输出 ...
- lcg_magic算法笔记:反转单链表
文章目录 1. 题目 2. 无头结点的单链表 2.1. 原始单链表 2.2. 反转过程 2.3. 代码 2.4. 结果 2.5. Github 3. 带头结点的单链表 3.1. 初始单链表 3.2. ...
- 数据结构 - 反转单链表(C++)
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! // 反 ...
- python怎么反转单链表_单链表反转python实现代码示例
单链表的反转可以使用循环,也可以使用递归的方式 1.循环反转单链表 循环的方法中,使用pre指向前一个结点,cur指向当前结点,每次把cur->next指向pre即可. 代码: class Li ...
最新文章
- (.DS_Store)避免多人提交代码到GitHub上起冲突
- 《javascript高级程序设计》笔记:变量对象与预解析
- 设计模式-UML图简单介绍
- kubesphere添加新节点
- c++运算符和结合性
- Java 获取当前项目的类路径
- Sereja and Brackets CodeForces - 380C (树状数组+离线)
- 现金贷平台倒闭后,借的钱是否可以不还?
- 【英语学习】【WOTD】magniloquent 释义/词源/示例
- js制作带有遮罩弹出层实现登录小窗口
- 电路实验一阶电路误差分析_逆变器电路原理分析
- Java的throws Exception
- 基于javaweb房屋租赁系统设计与实现
- 用【快剪辑】给视频打马赛克
- python实现t分布
- 计算机操作系统出现死锁的原因
- threejs 三次贝塞尔曲线
- space-around space-evenly区别
- 流媒体服务器原理和架构解析
- android 蓝牙打印兼容,在Android中使用蓝牙打印机打印不起作用