试写一算法,对单链表进行逆置
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() 函数中(第一种方法):
- p = L, 即:使 p 指向 L 的头结点
- p = p->next, 即:p 向后移动一个位置。这是为了给另一个用来做反向连接的变量 q 挪地方
- 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.带头结点单链表就地逆置算法 部分函数调用参考如下:https://blog.csdn.net/qq_50504109/article/details/120288749 /*** 单向链表的逆置, ...
- java实现单链表就地逆置,单链表的就地逆置讲解
{ List *q; List *p = L->next; L -> next = NULL; //单链表就地逆置 while (p != NULL) { q = p -> next ...
- 无头结点单链表的逆置_第1章第2节练习题11 就地逆置单链表
## 问题描述 > 试编写在带头结点的单链表就地逆置,所谓"就地"是指辅助空间为O(1) ## 算法思想1 > 将头结点摘下,然后从第一个结点开始,依次插入到头节点的后 ...
- 有头结点单链表的逆置
[问题描述] 设有头结点单链表,编写算法实现单链表逆置. [输入形式] 第一行输入一个整数N: 第二行输入N个整数,以空格作为分隔,创建单链表: [输出形式] 输出逆置后的单链表,,元素之间以空格分隔 ...
- C语言实现单链表的逆置
单链表的逆置是一个非常经典的问题,这里利用两个思想进行解决. 首先,我们需要看下原理图,其实两个思想都是一样的,都是使后一个的节点的 next 指针指向前一个节点,依次递推,直 ...
- 单链表的逆置-C++实现(ok)
对于单链表的逆置有两种方法可以实现: (1)利用辅助指针 基本思想:在遍历结点过程中,设置辅助指针,用于记录先前遍历的结点.这样依次编译的过程中只需修改其后继结点的next域即可. 实现代码: [cp ...
- (二十四) 单链表的逆置(java)
前言:单链表的逆置总是看完博客,当时懂了过一段时间就忘了,还是动手写一下加深一下印象吧. 参考博客:点击打开链接 demo地址:我的github 1. 单链表 先写一个简单的单链表,改写一下它的toS ...
- 头插法逆置单向链表c语言,单链表的逆置(头插法和就地逆置)
今天课间的时候偶然看到了一个面试题:单链表的逆置,看了题解感觉乖乖的,貌似和以前看的版本不搭,于是重新进行了一番探究 单链表的逆置分为两种方法:头插法和就地逆置法,这两种方法虽然都能够达到逆置的效果, ...
- 无头结点单链表的逆置_解析单链表逆置的多种方法 | 术与道的分享
单链表的逆置还是很重要的,不过第一次写逆置的时候程序就直接奔溃了,因为解决与链表相关的问题总是有大量的指针操作,而指针操作的代码总是容易出错的,因此这也就成就了单链表在面试中的地位. 1.普通循环逆置 ...
最新文章
- pythonfor循环语句1到7、不要4_【IT专家】关于Python中的for循环控制语句
- 微信公众号开发之获取微信用户的openID
- java筑基期(9)----ajaxjson(1)
- 百度智能云大数据全景架构图如何赋能企业数字化
- linux c语言编程内嵌汇编,gcc编译c语言中内嵌汇编
- codeforces1472 G. Moving to the Capital
- jquery基本过滤选择器(jquery筛选选择器)
- 20200317_利用神经网络预测贷款率
- rmarkdown+flexdashboard制作dashboard原型
- 利用Karma、Jasmine 做前端单元测试
- P2P下载器-P2P种子搜索器
- i2c-tools下载安装及使用调试
- 指数加权移动平均法(EWMA)
- 对计算机的一些浅显的认识
- win7与xp 字体命名问题影响打印
- 分享Silverlight/WPF/Windows Phone一周学习导读(07月11日-07月17日)
- 页脚代码html,博客园页脚 HTML 代码 .html
- 本以为大厂无望,结果陆续收到京东/滴滴/爱奇艺offer的我迷茫了
- 什么时间吃nmn比较好,nmn服用产生效果和时间,请正确认识
- 信息竞赛(NOI)如何高效刷题 建议刷题历程