逆序单链表(C语言)

16 篇文章 1 订阅
订阅专栏

先看一下

单链表节点的结构
typedef int DataType;
typedef struct Node
{
    DataType _data;
    struct Node* _next;
}Node, *PNode;
单链表的尾插操作
void SListPushBack(PNode* pHead, DataType data)
{
    PNode _new = NULL;
    // 参数检验
    assert(pHead);

    _new = BuyNewNode(data);
    if (NULL == _new)
    {
        return;
    }
    else
    {
        if (NULL == (*pHead))
        {
            *pHead = _new;
        }
        else
        {
            PNode pCur = NULL;
            pCur = (*pHead);

            while (!(pCur->_next == NULL))
            {
                pCur = pCur->_next;
            }

            pCur->_next = _new;
        }
    }
}

看一个简单的题目

从尾到头打印单链表

思想: 递归
如果当前节点的next域不为空,递归打印next域之后的内容,直到当前节点为空,返回,打印当前节点的值data.

来看代码

// 从尾到头打印单链表 
void PrintSListFromTail2Head(PNode pHead)
{
    if (pHead == NULL)
    {
        printf("NULL");
        return;
    }
    PrintSListFromTail2Head(pHead->_next);

    printf("->%d", pHead->_data);
}

之后我们测试一把

void TestPrintSListFromTail2Head()
{
    PNode pHead = NULL;
    SListPushBack(&pHead, 1);
    SListPushBack(&pHead, 2);
    SListPushBack(&pHead, 3);
    SListPushBack(&pHead, 4);

    printf("positive seq: ");
    PrintNode(pHead);

    printf("inverted seq: ");
    PrintSListFromTail2Head(pHead);
    printf("\n");
}

int main()
{
    TestPrintSListFromTail2Head();
    system("pause");
    return 0;
}

测试结果
这里写图片描述


单链表逆序

方法一 循环迭代
思想:
这里写图片描述
使用额外的存储节点pPre, 初始状态下,pPre指向NULL;head指向当前节点
用pNext保存当前节点的next域,此时我们就可以把头节点摘下来,将pPre交给head->_next(相当于把当前节点摘下来了),然后移动head和next指针。
这里写图片描述
我们发现一次操作不能达到目标,需要循环,循环终止条件head指针为空
这里写图片描述
最后我们发现pPre里保存的就是逆序后单链表的头指针

之后我们来看代码:

// 逆序单链表
PNode ReverseLink(PNode *head)
{
    PNode _pNext = NULL;
    PNode _pPre = NULL;

    assert(head);

    while ((*head) != NULL)
    {
        _pNext = (*head)->_next;
        (*head)->_next = _pPre;
        _pPre = (*head);
        (*head) = _pNext;
    }

    return _pPre;
}

然后我们来测试一把:


void TestReverse()
{
    PNode pHead = NULL;
    SListPushBack(&pHead, 1);
    SListPushBack(&pHead, 2);
    SListPushBack(&pHead, 3);
    SListPushBack(&pHead, 4);

    printf("positive seq: ");
    PrintNode(pHead);

    printf("inverted seq: ");
    PrintSListFromTail2Head(pHead);
    printf("\n");

    pHead = ReverseLink(&pHead);
    printf("After Renerse: ");
    PrintNode(pHead);
}

int main()
{
    TestReverse();
    system("pause");
    return 0;
}

测试结果
这里写图片描述

方法二递归
思想:
这里写图片描述
如果当前节点的next域不为空,就递归逆序next域之后的单链表
递归出口: 单链表只剩下一个节点
回溯的时候,让next域反转过来,这是关键!!!!
来看代码

// 逆序单链表递归
PNode ReverseLinkRcs(PNode *head)
{
    PNode _newNode = NULL;

    assert(head);
    if ((*head) == NULL || (*head)->_next == NULL)
    {
        return (*head);
    }

    _newNode = ReverseLinkRcs(&(*head)->_next); // 递归部分
    (*head)->_next->_next = (*head); // 回溯
    (*head)->_next = NULL;

    return _newNode;

}

测试

void TestReverse()
{
    PNode pHead = NULL;
    SListPushBack(&pHead, 1);
    SListPushBack(&pHead, 2);
    SListPushBack(&pHead, 3);
    SListPushBack(&pHead, 4);

    printf("positive seq: ");
    PrintNode(pHead);

    printf("inverted seq: ");
    PrintSListFromTail2Head(pHead);
    printf("\n");

    pHead = ReverseLinkRcs(&pHead);
    printf("After Renerse: ");
    PrintNode(pHead);
}

int main()
{
    TestReverse();
    system("pause");
    return 0;
}

测试结果
这里写图片描述


如有不正,还请指出,有劳!

单链表逆置(就地逆序C语言实现
12-14 4928
<br />LinkList.h<br />#ifndef LINKLIST_H #define LINKLIST_H typedef int ElemType; typedef struct LNode { ElemType *data; struct LNode *next; int length; }LNode, *LinkList; LinkList initList(); void insertList(LinkList l, ElemType *data, int
链表的逆序问题(C语言)
qq_41582941的博客
12-16 417
方法一 :   从第二个结点开始,把之后的每个结点都插入到第一个结点之后,最后在把第一个结点挪                 到表尾 , 该方法中类似于链表头插法 struct stu *reserve(struct stu *head) { struct stu *p,*q; p=head-&gt;next; ...
单链表逆转
m0_52903722的博客
01-14 1040
单链表逆转 以pta题为例: 函数接口定义: List Reverse( List L ); 其中List结构定义如下: typedef struct Node *PtrToNode; struct Node { ElementType Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */ }; typedef PtrToNode List; /* 定义单链表类型 */ L是给定单链表,函数Reverse要返回被逆转后的链表。 裁判测
C语言单链表逆序
L1965314411的博客
03-26 4727
1.什么是链表逆序?(本次所使用的链表是包含头结点的链表) 举个例子,有这样的一个链表: 逆序后的链表: 注意:逆序前后的头指针和头结点是一样的。 #include <stdio.h> #include <string.h> #include <stdlib.h> //定义链表的数据结构 struct plist { int data; struct plist* next; }; //定义创建链表结点函数 struct plist* createno
C语言单向链表的逆序输出
热门推荐
沉在海里的鱼的博客
07-12 1万+
最近在学习链表,看到书上说可以采取每次在链表头部插入新增节点的方法,将链表逆序,也就是建立的链表节点内容与数据的输入顺序相反。我便来了兴趣,想着试试看,结果没搞懂,于是开始百度。看了几遍博客后终于是明白了,而后写作的兴趣又上来了。。。。一个初学者就算再怎么来了兴趣,也不可能写得很好,所以有不对的地方,欢迎大家指出!顺便这里附上一篇写得很好的博客:点击蓝色字体。我正是看了这篇博客才大概弄懂了链表逆序,还自己手画链表才理解的。 博主要讲的单链表逆序...
单链表逆序(详细)
github_51186756的博客
09-29 4089
单链表逆序 创建结构体 struct lb{ int a; lb* next = NULL; }; struct lb* head, * p1, * p2,*h,*z; 创建链表函数 void creatlb(int n) { head = (struct lb*)malloc(sizeof(struct lb)); p2 = head; for (int i = 1; i <= n; i++) { p1 = (struct lb*)malloc(sizeo..
单向链表之逆序C语言实现)
peng_fp的博客
03-20 1万+
链表的创建查看 逆序思想: 1、链表为空时:不需要逆序; 2、链表只有一个节点时:不需要逆序; 3、链表的节点为两个以及两个以上时:需要逆序 结构体节点: typedef struct student { int num; //学号 int score; //分数 char name[20]; struct student
C语言实现单链表逆序逆序输出实例
09-04
主要介绍了C语言实现单链表逆序逆序输出,是数据结构与算法中比较基础的重要内容,有必要加以牢固掌握,需要的朋友可以参考下
C语言数据结构实现链表逆序并输出
08-30
主要介绍了C语言数据结构实现链表逆序并输出的相关资料,需要的朋友可以参考下
单链表逆序与排序
07-09
linux 下 c语言实现 单链表逆序与排序, 包含测试程序, 编译时需加-DTEST
单链表逆序
03-04
单链表逆序 步骤: 1. 初始化单链表 2. 动态创建单链表(插入操作) 3. 逆序算法处理 4. 打印输出 5. 释放动态创建的单链表
C语言链表逆序技巧
04-19
简洁的做法是  遍历链表,  元素进栈,  遍历的同时销毁原来的链表。  元素出栈,  建立新链表。  高效的是,
逆序创建单链表C语言实现
wzy_xd666的博客
10-24 1487
首先,结构体定义一个单链表; typedef struct LNode { ElemType data; struct LNode *next; }LNode,*LinkList; 逆序创建单链表; void createList(LinkList &L,int n) { LinkList p; L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; printf("请输入元素的值:"); for(int i=n;i&g..
数据结构 C语言 01 -- 单向链表 实现 逆序
人生一世 草木一秋
07-31 799
C语言实现单向链表的逆序
单链表的反转(C语言实现)
qq_37406462的博客
09-25 2466
链表的反转或者说逆序的核心思想:遍历链表将所有节点依次摘链,并重新挂在链表头。 假设我们有一个链表,如图 A节点本身就是头节点,所以不必将其再摘链,挂链 所以第一步我们将B节点提到最前面 这个时候C节点变成了A节点的后继节点,我们需要把C节点提到最前面 这样D节点成了A节点的后继节点,依次类推,我们每次只需要将A节点的后继节点摘链并提到最前面即可完成整个链表的反转。 关键代...
C语言实现单链表逆序
谋天下的博客
06-14 1579
问题描述::实现单链表逆序,如输入1 2 3 4 5 6,则输出6 5 4 3 2 1。 #include<stdio.h> #include<stdlib.h> void main(){ struct node { int data; struct node *next; }; struct node *p,*q,*k,*h,*l,*o,*z,*f,*g; int n,m,b=0; printf("请输入序列的长度:"); scanf("%d",&m); printf(
数据结构与算法——单链表逆序
icc_hhy的博客
05-21 1017
在之前,了解了单链表结点的删除和插入之后,大家会发现这种具有方向性的链表结构中增删结点是相当容易的一件事。要从头到尾输出整个单链表也不难,但是如果要反转过来输出单向链表就需要某些技巧了。单向链表的结点特性就是知道下一个结点的位置,可是却无法得知它上一个结点的位置。因此下面将介绍2中方法来实现单链表逆序操作。
单链表逆序输出c语言
最新发布
09-23
单链表逆序输出的C语言实现方法可以使用递归来实现。可以定义一个递归函数,该函数先递归调用自身打印链表的后继结点,然后再打印当前结点的数据。最后,在主函数中调用该递归函数即可实现逆序输出。 示例代码如下: ```c void R_Print(LNode* L) { if(L->next != NULL) { R_Print(L->next); // 递归调用自身打印后继结点 } printf("%d\n", L->data); // 打印当前结点的数据 return; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 排序 ---- 快排(C语言) 7429
  • TCP通信基本流程 5271
  • 环形链表专题 4461
  • find_char (C 语言) 2927
  • [flink sql] ClassCastException: java.lang.Boolean cannot be cast to java.lang.Integer 2850

分类专栏

  • 数据库 2篇
  • flink 3篇
  • JVM 1篇
  • Java 11篇
  • scala
  • spark 2篇
  • 设计模式 2篇
  • antd 2篇
  • react 2篇
  • js 2篇
  • 开发心得 1篇
  • 动态规划 3篇
  • 数据结构与算法 16篇
  • Linux 14篇
  • CPlusPlus 6篇
  • 网络 8篇
  • newcoder 37篇
  • acm专项训练 2篇
  • c语言算法 4篇
  • The first day of CSDN! 2篇
  • 读书笔记 1篇
  • Python 2篇

最新评论

  • TCP通信基本流程

    丰哥86: 内容细致,排版好看,赞

  • [flink sql] ClassCastException: java.lang.Boolean cannot be cast to java.lang.Integer

    zhangbaqing: 是相同的场景嘛? 数据库tinyint(1) 转 flink int

  • [flink sql] ClassCastException: java.lang.Boolean cannot be cast to java.lang.Integer

    机佬快跑: 为啥加了也不生效呢

  • [flink sql] ClassCastException: java.lang.Boolean cannot be cast to java.lang.Integer

    机佬快跑: 不生效阿 为啥

  • antd 的table td 超出部分隐藏并显示省略号 ,鼠标悬停显示内容

    zhangbaqing: 时间有点久了,您看看官网的文档吧:https://3x.ant.design/components/table-cn/#components-table-demo-ellipsis

大家在看

  • C语言学习笔记[11]:初识选择语句
  • Linux搭建我的世界乌托邦探险之旅3.2整合包服务端,Minecraft开服教程 879
  • C++前期概念(重) 1274
  • 达梦数据库系列—2.DM单实例环境搭建 162
  • 反向传播算法-人工智能及其应用-课程学习记录-3

最新文章

  • RSA public key is not available client side (option serverRsaPublicKeyFile not set)
  • SQL统计连续问题
  • INSERT ... ON DUPLICATE KEY UPDATE
2023年1篇
2022年6篇
2021年9篇
2020年5篇
2019年35篇
2018年53篇
2017年4篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

两个鬼故事梦见死去的母亲网上宝宝免费起名字沈阳一门市发生爆炸有消防员受伤用爸妈的名字怎么 起名三个土舄乌虎帝苦草起别名起个双胞胎名字女孩起什么小名字好听向日葵不开的夏天玩具娃娃起名字大全集小吃连锁店内衣店起什么名月上重火下载平安健康app小教室美少女万华镜5字体文件夹湖北基本药物采购平台起名带柳家庭农场起什么名字合肥阶梯电价臭作动画用友票据通杨姓男宝宝起名大全属牛混在抗战按辈份起名属鼠男孩的起名大全孩子起名公司贪睡的女孩子起网名少年生前被连续抽血16次?多部门介入两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”淀粉肠小王子日销售额涨超10倍高中生被打伤下体休学 邯郸通报单亲妈妈陷入热恋 14岁儿子报警何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言张家界的山上“长”满了韩国人?男孩8年未见母亲被告知被遗忘中国拥有亿元资产的家庭达13.3万户19岁小伙救下5人后溺亡 多方发声315晚会后胖东来又人满为患了张立群任西安交通大学校长“重生之我在北大当嫡校长”男子被猫抓伤后确诊“猫抓病”测试车高速逃费 小米:已补缴周杰伦一审败诉网易网友洛杉矶偶遇贾玲今日春分倪萍分享减重40斤方法七年后宇文玥被薅头发捞上岸许家印被限制高消费萧美琴窜访捷克 外交部回应联合利华开始重组专访95后高颜值猪保姆胖东来员工每周单休无小长假男子被流浪猫绊倒 投喂者赔24万小米汽车超级工厂正式揭幕黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发当地回应沈阳致3死车祸车主疑毒驾恒大被罚41.75亿到底怎么缴妈妈回应孩子在校撞护栏坠楼外国人感慨凌晨的中国很安全杨倩无缘巴黎奥运校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变王树国卸任西安交大校长 师生送别手机成瘾是影响睡眠质量重要因素国产伟哥去年销售近13亿阿根廷将发行1万与2万面值的纸币兔狲“狲大娘”因病死亡遭遇山火的松茸之乡“开封王婆”爆火:促成四五十对奥巴马现身唐宁街 黑色着装引猜测考生莫言也上北大硕士复试名单了德国打算提及普京时仅用姓名天水麻辣烫把捣辣椒大爷累坏了

两个鬼故事 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化