单链表的逆置算法解析
问题描述:
比方说,一个不带头节点的单链表原来从头到尾存储的是(1, 2, 3, 4, 5),逆置后链表从头到尾存储的是(5,4,3,2,1)
解决思路:
我暂时想到的有三种解法:
1)从头到尾依次访问旧的链表节点,每访问一个,就将这个节点的数据用头插的方法插入到新的链表中,这样当旧的链表访问完毕时,新的链表就构造成功了,然后释放掉原来的链表空间,将头指针指向新的链表头节点。
2)和第一个方法类似,也是从头到尾访问旧的链表节点,不同之处在于:每访问一个节点,就将这个节点插入到新的链表中,旧的链表访问完毕时,新的链表也构造成功了。这个因为没有申请新的节点空间,也没有释放旧的节点空间,所以 效率上要比第一个方法好很多。
3)采用就地逆置,即在旧的链表上直接逆置,操作完成后,旧的链表就被逆置成功了。这种方法既容易理解,效率又比较理想,我会重点讲这个方法。
第一种方法
开始的时候定义两个指针,一个指向旧链表,一个指向新链表(开始的时候为空)。
然后申请一个节点并用旧链表的当前节点数值域填充新节点,将新节点采用头插法插入到新链表中,然后指向旧链表的指针向后走。
然后循环这个过程,直到遍历完旧链表。
第二种方法
开始的时候状态和第一种相同
然后将旧链表的当前节点拆下来,头插法插入到新链表中。
重复这个过程,直到遍历完旧链表。
第三种方法
最开始定义三个指针tmp
, tmp_pre
, tmp_next
, 用tmp
指向当前节点,tmp_pre
指向当前节点的上一个节点,tmp_next
指向当前节点的下一个节点。开始的时候tmp
指向链表的第一个节点,其他两个指针指向NULL。
然后更新tmp
(当前节点)的指针域,让其指针域指向上一个节点tmp_pre
,但是如果直接更新,那么当前节点的下一个节点就找不到了,所以在更新当前节点的指针域之前,先保存下一个节点的地址,也就是让tmp_next
指向tmp
的下一个节点。
因为这个过程是循环进行的,所以要让指针沿着链表向后走。让tmp
指向它的下一个节点,也就是刚才tmp_next
指向的节点,因为tmp
永远指向当前节点,tmp_pre
永远指向当前节点的上一个节点,所以在让tmp
向后走之前,先让tmp_pre
指向tmp
指向的节点。我画图把这个过程走一遍,结合图看这段话就能更容易理解。
1)
2)
3)
然后重复上面那个过程,直到走到链表的结尾,逆置成功。
实现代码
第三种方法编码实现
void ListReverse(PNode* head){assert(head);PNode ptr_pre = NULL;PNode ptr = *head;PNode ptr_next = NULL;while (ptr){ptr_next = ptr->_link; //保存当前节点的下一个节点ptr->_link = ptr_pre;//更新当前节点的指针域ptr_pre = ptr;//更新当前节点上一个节点的位置ptr = ptr_next;//更新当前节点的位置}*head = ptr_pre;//更新头指针指向新链表第一个节点
}
单链表的逆置算法解析相关推荐
- 带头结点单链表就地逆置算法
1.带头结点单链表就地逆置算法 部分函数调用参考如下:https://blog.csdn.net/qq_50504109/article/details/120288749 /*** 单向链表的逆置, ...
- 无头结点单链表的逆置_解析单链表逆置的多种方法 | 术与道的分享
单链表的逆置还是很重要的,不过第一次写逆置的时候程序就直接奔溃了,因为解决与链表相关的问题总是有大量的指针操作,而指针操作的代码总是容易出错的,因此这也就成就了单链表在面试中的地位. 1.普通循环逆置 ...
- 试写一算法,对单链表进行逆置
NOTICE: 本篇代码是按照源码的书写顺序所写,复制之后可直接运行. 环境: vscode 题目: 试写一算法,对单链表进行逆置 分析: 单链表的逆置需要设置两个指针,第一个进行遍历单链表:第二个进 ...
- C语言实现单链表的逆置
单链表的逆置是一个非常经典的问题,这里利用两个思想进行解决. 首先,我们需要看下原理图,其实两个思想都是一样的,都是使后一个的节点的 next 指针指向前一个节点,依次递推,直 ...
- 无头结点单链表的逆置_第1章第2节练习题11 就地逆置单链表
## 问题描述 > 试编写在带头结点的单链表就地逆置,所谓"就地"是指辅助空间为O(1) ## 算法思想1 > 将头结点摘下,然后从第一个结点开始,依次插入到头节点的后 ...
- 有头结点单链表的逆置
[问题描述] 设有头结点单链表,编写算法实现单链表逆置. [输入形式] 第一行输入一个整数N: 第二行输入N个整数,以空格作为分隔,创建单链表: [输出形式] 输出逆置后的单链表,,元素之间以空格分隔 ...
- 头插法逆置单向链表c语言,单链表的逆置(头插法和就地逆置)
今天课间的时候偶然看到了一个面试题:单链表的逆置,看了题解感觉乖乖的,貌似和以前看的版本不搭,于是重新进行了一番探究 单链表的逆置分为两种方法:头插法和就地逆置法,这两种方法虽然都能够达到逆置的效果, ...
- java实现单链表就地逆置,单链表的就地逆置讲解
{ List *q; List *p = L->next; L -> next = NULL; //单链表就地逆置 while (p != NULL) { q = p -> next ...
- 无头结点单链表的逆置_单链表的增删查 逆置 倒数第k个节点等问题
对于单链表而言,它没有双链表那么复杂,它只有头节点,尾节点,节点数据,后继指针.在下面本人实现了 单链表的 增 删 插 查 改. #include #include #include #i ...
最新文章
- C++ 与 JAVA区别
- 宜宾地震,这个系统跑赢了“地震波”!
- C# IEnumerable和IEnumerator的区别,如何实现
- 阿里的“扫地僧”,2年“抄”了20万页古籍
- centos7系统/etc/resolv.conf 配置DNS客户
- linux 空格函数,linux c语言的split函数和空格处理函数
- Microsoft SQL Server 存储过程
- .net 实现 URL重写,伪静态 1
- Linux常用的网络服务基础命令
- Firefox七种武器之firebug
- Mysql 更改用户名密码
- linux绝育玩客云_玩客云绝育,不影响下载功能
- Word无法打开该文件,因为文件格式与文件扩展名不匹配
- 用Java自动发邮件
- 计算机电源功率计算器,装机不用愁 航嘉功率计算器教你选电源
- 成都拓嘉启远:拼多多直通车常见问题分享
- 联想C3微型计算机C3,一体电脑试用报告 联想ideacentre A600
- 初识Delphi---Delphi编程语言(1)
- 基于汇编语言实现的带小数的四则运算
- 网址格式化:截取域名