NOTICE: 本篇代码是按照源码的书写顺序所写,复制之后可直接运行。

环境: vscode

题目:

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

分析:

单链表的逆置需要设置两个指针,第一个进行遍历单链表;第二个进行节点的反向连接。

单链表的逆置其实就是反复利用删除插入操作。

主意:本题所说的逆置不能开辟新的内存空间,这样一来就不能创建一个新的表然后利用尾插法进行“逆置”了。

代码:

初始化单链表:

#include<stdio.h>
#include<stdlib.h>#define OK 1
#define ERROR 0typedef int ElemType;
typedef int Status;typedef struct LNode
{ElemType data;LNode *next;
}LNode, *LinkList;Status InitList(LinkList &L)
{   // 初始化单链表 LL = (LNode*)malloc(sizeof(LNode));L->next = NULL;return OK;
}//InitList

生成单链表:

Status CreateList(LinkList &L, int e)
{   // 创建单链表 LLinkList p = L;while(p->next)p = p->next;LinkList temp = (LinkList)malloc(sizeof(LNode));temp->data = e;temp->next = NULL;p->next = temp;return OK;
}//CreateList

打印单链表:

Status DispList(LinkList &L)
{   // 打印单链表 LLinkList p = L->next;while(p){printf("%d\t", p->data);p = p->next;}return OK;
}//DispList

逆置:

Status ListOppose(LinkList &L)
{   // 将带表头节点的单链表逆置LinkList q, p, s;p = L;p = p->next;L->next = NULL;while(p) // 因为 while 中有 p = p->next 所以终止条件不用写成 p->next{q = p;p = p->next;q->next = L->next; // q 节点指向现在的 L 的首元结点。这一行加上下一行相当于一个插入操作L->next = q;}return OK;
}//ListOppose

方法二:

Status ListOppose(LinkList &L)
{   // 将带表头节点的单链表逆置LinkList q, p, s;p = L->next;q = p->next;s = q->next;p->next = NULL;while(s->next){q->next = p;p = q;q = s;s = s->next;}// 将尾结点连接到原表的首元结点q->next = p;s->next = q;L->next = s;return OK;
}//ListOppose

主函数:

int main()
{int i;LinkList L;InitList(L);for(i=1; i<=10; i++)CreateList(L, i);printf("\n创建的单链表为:\n");DispList(L);printf("\n逆置后的单链表为:\n");ListOppose(L);DispList(L);return OK;
}

创建好的单链表为:

(PS: 画图太难了!!!!!我透!)

其中,ListOppose() 函数中(第一种方法):

  1. p = L, 即:使 p 指向 L 的头结点
  2. p = p->next, 即:p 向后移动一个位置。这是为了给另一个用来做反向连接的变量 q 挪地方
  3. L->next = NULL, 将表 L 掐断,变成如下图所示:

4. 第一次循环:

q = p; p = p->next;  这两行就是把 q 指向 p,然后将 p 向后移动到下一个节点:

q->next = L->next;  L->next = q;  这两行就是进行插入,即:将 q 所指的节点插入到现在的表 L 的头结点和首元结点中间:

如果搞不清楚 q 和 p 所指向的节点的话,可以在程序里打印 q->data 或者 p->data,这样就能很清楚的看到每次循环 q 和 p 所指节点。我复盘的时候就蒙圈了,不晓得 q 先指向哪个节点,所以我打印了 q->data:

然后看到运行结果如下图:

可以很清楚的看到,q 先指向首元结点。

第二次循环:

q = p; p = p->next; q 向后移,p 也向后移;

q->next = L->next; L->next = q; 将 data 域为 2 的节点插入到首元结点之前:

第三次循环:

q = p; p = p->next; q->next = L->next; L->next = q; 将 data 域为 3 的加点插入到首元结点的前边:

以此类推,到最后一次循环结束的时候:

没错,p 指向空,此时跳出循环,但是整个单链表的逆置也已经完成了。

运行结果示意图:

THE END!

试写一算法,对单链表进行逆置相关推荐

  1. 带头结点单链表就地逆置算法

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

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

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

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

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

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

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

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

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

  6. 单链表的逆置-C++实现(ok)

    对于单链表的逆置有两种方法可以实现: (1)利用辅助指针 基本思想:在遍历结点过程中,设置辅助指针,用于记录先前遍历的结点.这样依次编译的过程中只需修改其后继结点的next域即可. 实现代码: [cp ...

  7. (二十四) 单链表的逆置(java)

    前言:单链表的逆置总是看完博客,当时懂了过一段时间就忘了,还是动手写一下加深一下印象吧. 参考博客:点击打开链接 demo地址:我的github 1. 单链表 先写一个简单的单链表,改写一下它的toS ...

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

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

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

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

最新文章

  1. pythonfor循环语句1到7、不要4_【IT专家】关于Python中的for循环控制语句
  2. 微信公众号开发之获取微信用户的openID
  3. java筑基期(9)----ajaxjson(1)
  4. 百度智能云大数据全景架构图如何赋能企业数字化
  5. linux c语言编程内嵌汇编,gcc编译c语言中内嵌汇编
  6. codeforces1472 G. Moving to the Capital
  7. jquery基本过滤选择器(jquery筛选选择器)
  8. 20200317_利用神经网络预测贷款率
  9. rmarkdown+flexdashboard制作dashboard原型
  10. 利用Karma、Jasmine 做前端单元测试
  11. P2P下载器-P2P种子搜索器
  12. i2c-tools下载安装及使用调试
  13. 指数加权移动平均法(EWMA)
  14. 对计算机的一些浅显的认识
  15. win7与xp 字体命名问题影响打印
  16. 分享Silverlight/WPF/Windows Phone一周学习导读(07月11日-07月17日)
  17. 页脚代码html,博客园页脚 HTML 代码 .html
  18. 本以为大厂无望,结果陆续收到京东/滴滴/爱奇艺offer的我迷茫了
  19. 什么时间吃nmn比较好,nmn服用产生效果和时间,请正确认识
  20. 信息竞赛(NOI)如何高效刷题 建议刷题历程

热门文章

  1. Python编程解决“今天午饭吃什么?”
  2. H5,JS仿微信输入法,键盘上面带input输入框,兼容安卓、ios
  3. 你认为程序员的最高境界是什么?
  4. 计算机毕业设计ssm+vue基本微信小程序的智能图书管理系统
  5. FFmpeg 逐行扫描和隔行扫描转换命令
  6. CAD制图有什么技巧?怎么开始学习CAD建筑设计图纸的绘制?
  7. 蓝牙arrayBuffer数据转10进制在转有符号数
  8. 你要的职场“摸鱼”神器来了!(文末送书)
  9. 为什么ToB产品需要这么多文档?
  10. RT5350无线视频监控