问题描述:

比方说,一个不带头节点的单链表原来从头到尾存储的是(1, 2, 3, 4, 5),逆置后链表从头到尾存储的是(5,4,3,2,1)

解决思路:

我暂时想到的有三种解法:

​ 1)从头到尾依次访问旧的链表节点,每访问一个,就将这个节点的数据用头插的方法插入到新的链表中,这样当旧的链表访问完毕时,新的链表就构造成功了,然后释放掉原来的链表空间,将头指针指向新的链表头节点。

​ 2)和第一个方法类似,也是从头到尾访问旧的链表节点,不同之处在于:每访问一个节点,就将这个节点插入到新的链表中,旧的链表访问完毕时,新的链表也构造成功了。这个因为没有申请新的节点空间,也没有释放旧的节点空间,所以 效率上要比第一个方法好很多。

​ 3)采用就地逆置,即在旧的链表上直接逆置,操作完成后,旧的链表就被逆置成功了。这种方法既容易理解,效率又比较理想,我会重点讲这个方法。

第一种方法

开始的时候定义两个指针,一个指向旧链表,一个指向新链表(开始的时候为空)。

然后申请一个节点并用旧链表的当前节点数值域填充新节点,将新节点采用头插法插入到新链表中,然后指向旧链表的指针向后走。

然后循环这个过程,直到遍历完旧链表。

第二种方法

开始的时候状态和第一种相同

然后将旧链表的当前节点拆下来,头插法插入到新链表中。

重复这个过程,直到遍历完旧链表。

第三种方法

最开始定义三个指针tmptmp_pretmp_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. 带头结点单链表就地逆置算法

    1.带头结点单链表就地逆置算法 部分函数调用参考如下:https://blog.csdn.net/qq_50504109/article/details/120288749 /*** 单向链表的逆置, ...

  2. 无头结点单链表的逆置_解析单链表逆置的多种方法 | 术与道的分享

    单链表的逆置还是很重要的,不过第一次写逆置的时候程序就直接奔溃了,因为解决与链表相关的问题总是有大量的指针操作,而指针操作的代码总是容易出错的,因此这也就成就了单链表在面试中的地位. 1.普通循环逆置 ...

  3. 试写一算法,对单链表进行逆置

    NOTICE: 本篇代码是按照源码的书写顺序所写,复制之后可直接运行. 环境: vscode 题目: 试写一算法,对单链表进行逆置 分析: 单链表的逆置需要设置两个指针,第一个进行遍历单链表:第二个进 ...

  4. C语言实现单链表的逆置

          单链表的逆置是一个非常经典的问题,这里利用两个思想进行解决.       首先,我们需要看下原理图,其实两个思想都是一样的,都是使后一个的节点的 next 指针指向前一个节点,依次递推,直 ...

  5. 无头结点单链表的逆置_第1章第2节练习题11 就地逆置单链表

    ## 问题描述 > 试编写在带头结点的单链表就地逆置,所谓"就地"是指辅助空间为O(1) ## 算法思想1 > 将头结点摘下,然后从第一个结点开始,依次插入到头节点的后 ...

  6. 有头结点单链表的逆置

    [问题描述] 设有头结点单链表,编写算法实现单链表逆置. [输入形式] 第一行输入一个整数N: 第二行输入N个整数,以空格作为分隔,创建单链表: [输出形式] 输出逆置后的单链表,,元素之间以空格分隔 ...

  7. 头插法逆置单向链表c语言,单链表的逆置(头插法和就地逆置)

    今天课间的时候偶然看到了一个面试题:单链表的逆置,看了题解感觉乖乖的,貌似和以前看的版本不搭,于是重新进行了一番探究 单链表的逆置分为两种方法:头插法和就地逆置法,这两种方法虽然都能够达到逆置的效果, ...

  8. java实现单链表就地逆置,单链表的就地逆置讲解

    { List *q; List *p = L->next; L -> next = NULL; //单链表就地逆置 while (p != NULL) { q = p -> next ...

  9. 无头结点单链表的逆置_单链表的增删查 逆置 倒数第k个节点等问题

    对于单链表而言,它没有双链表那么复杂,它只有头节点,尾节点,节点数据,后继指针.在下面本人实现了 单链表的 增   删   插  查  改. #include #include #include #i ...

最新文章

  1. C++ 与 JAVA区别
  2. 宜宾地震,这个系统跑赢了“地震波”!
  3. C# IEnumerable和IEnumerator的区别,如何实现
  4. 阿里的“扫地僧”,2年“抄”了20万页古籍
  5. centos7系统/etc/resolv.conf 配置DNS客户
  6. linux 空格函数,linux c语言的split函数和空格处理函数
  7. Microsoft SQL Server 存储过程
  8. .net 实现 URL重写,伪静态 1
  9. Linux常用的网络服务基础命令
  10. Firefox七种武器之firebug
  11. Mysql 更改用户名密码
  12. linux绝育玩客云_玩客云绝育,不影响下载功能
  13. Word无法打开该文件,因为文件格式与文件扩展名不匹配
  14. 用Java自动发邮件
  15. 计算机电源功率计算器,装机不用愁 航嘉功率计算器教你选电源
  16. 成都拓嘉启远:拼多多直通车常见问题分享
  17. 联想C3微型计算机C3,一体电脑试用报告 联想ideacentre A600
  18. 初识Delphi---Delphi编程语言(1)
  19. 基于汇编语言实现的带小数的四则运算
  20. 网址格式化:截取域名

热门文章

  1. 工作流应用 电子表单签核
  2. JavaScript正负运算符
  3. 玲珑杯Unity开发心得——进度条界面(异步加载游戏场景)
  4. 全民分销时代,企业如何运营分销平台?
  5. Android 短信数据库详细总结分析
  6. 运放电压跟随电路应用
  7. QT xml转ini的实现(从C#转到QT)
  8. [蓝桥杯]横向打印二叉树 Python满分解法
  9. Java------IO流之文件专属流
  10. 苹果IOS开发者账号总结