首页 > 编程语言 >【C++】原地逆置单链表(不开辟新的储存空间)

【C++】原地逆置单链表(不开辟新的储存空间)

时间:2024-10-19 20:49:02浏览次数:3  
标签:结点 单链 Lnode C++ next linklist NULL 逆置

首先看图例:

创建一个单链表L,并用指针p指向需要逆置的第一个结点,s指向p的下一个。(这里s的作用是为了防止p后的结点丢失)

548b8c2aab1d43f696ec164e9bd0c544.jpeg34d59d0f32404e2d82624abee06729c6.jpeg 

第一个结点逆置后成为最后一个,所以其后为NULL,即p->next=NULL(其他结点正常头插)

用s指向了的p之后的结点,所以它们不会丢失。

69f9abbd067c46a8b90211a6d5af446c.jpeg

第一个结点接上后,p、s重新指向之后需要逆置的结点。

e3ad011d6e8d480f981262c87849bb3f.jpeg

第二个结点接上第一个,正常头插进去。p、s接着指。2fbb3dd519e240e883ce92dcabc8f74c.jpeg

073f04e6ac9d4797b22990fca3b3ef85.jpeg

重复上述过程,把最后一个结点也接上。

094440d3a79341c29bcf2e6853d44b5a.jpeg

 

注意,当p为NULL时要break,不然下一个语句就是s=p->next,会程序出错。ea09075edf834b628996ce0b7315857b.jpeg

 

逆置函数代码:

void inver(linklist &L)//头插法原地逆置
{
    int i=0;
    Lnode *p,*s;
    p=L->next;
    s=p->next;
    while(1)
    {
        if(i==0) {p->next=NULL;i++;}//第一个节点逆置后成为最后一个节点,之后应该是NULL
        else p->next=L->next;//其他正常头插
        L->next=p;
        p=s;
        if(p==NULL) break;//p==NULL,说明最后已逆置完成,赶紧退出循环,不然下一步“s=p->next”会报错
        s=p->next;
    }
}

 

完整代码:(输入数据为整型,以0为结束)

#include <bits/stdc++.h>//万能头文件

using namespace std;

typedef struct L
{
    int data;
    struct L *next;
}Lnode,*linklist;

void init_L(linklist &L)//初始化链表,‘&’一定要加!
{
    L=new Lnode;
    L->next=NULL;
}

void crep(linklist &L,int x)//头插法创建单链表,创建出来的链表是反序的,这里不用
{
    Lnode *p;
    p=(Lnode*)malloc(sizeof(Lnode));//为p开辟新的内存空间,如果不开可能会报错
    p->data=x;
    p->next=L->next;
    L->next=p;
}

void crea(linklist &L)//尾插法创建单链表
{
    int x;
    Lnode *p,*r;
    r=L;
    while(cin>>x)
    {
        if(x==0) break;
        p=(Lnode*)malloc(sizeof(Lnode));
        p->data=x;
        p->next=r->next;
        r->next=p;
        r=p;
    }
    p->next=NULL;
}

void inver(linklist &L)//头插法原地逆置
{
    int i=0;
    Lnode *p,*s;
    p=L->next;
    s=p->next;
    while(1)
    {
        if(i==0) {p->next=NULL;i++;}//第一个节点逆置后成为最后一个节点,之后应该是NULL
        else p->next=L->next;//其他正常头插
        L->next=p;
        p=s;
        if(p==NULL) break;//p==NULL,说明最后已逆置完成,赶紧退出循环,不然下一步“s=p->next”会报错
        s=p->next;
    }
}

void print(linklist &L)
{
    Lnode *p;
    p=L->next;
    while(p)
    {
        cout<<p->data<<' ';
        p=p->next;
    }
    cout<<endl;
}

int main()
{
    linklist L;
    init_L(L);
    crea(L);
    cout<<"原链表: ";
    print(L);
    inver(L);
    cout<<"逆置后的链表: ";
    print(L);
    return 0;
}

运行结果:

1b61e7e6866645bb913e0cd976a902eb.png

 

标签:结点,单链,Lnode,C++,next,linklist,NULL,逆置
From: https://blog.csdn.net/2301_80059009/article/details/142902647

相关文章

  • 【信奥赛·C++基础语法】CSP-J C++ STL 标准模板库 - 算法
    序言标准模板库(STL)的算法部分提供了一系列强大的工具,用于对各种容器中的数据进行操作。这些算法可以大大提高编程效率,减少代码重复,使程序更加简洁、高效和可读。无论是处理简单的数据结构还是复杂的大规模数据,STL算法都能发挥重要作用。一、STL算法的分类排序算法快速......
  • (新!)c++多态
    C++ 多态多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。C++多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。下面的实例中,基类Shape被派生为两个类,如下所示:实例#include<iostream>usingnames......
  • 洛谷知识点——C++ 11 实现一次性输出多行文本
    完整语法是R"deli(...)deli"。(其中deli并不是固定的,那里其实是一个用户自定义的字符序列,最多16个基本字符,不可含反斜线,空格和小括号。)故P1000超级玛丽游戏解法为#include<iostream>usingnamespacestd;intmain(){cout<<R"(********......
  • C++基础
    1、注释单行注释://这是注释多行注释:/*这是注释*/2、变量 数据类型变量名=变量初始值; 3、常量宏常量:通常在文件开头定义#define常量名常量值const修饰的静态变量,表示一个常量,不可修改。const数据类型常量名=常量值#include<iostream>usingna......
  • 「图::连通」详解并查集并实现对应的功能 / 手撕数据结构(C++)
    目录概述成员变量创建销毁根节点访问路径压缩启发式合并复杂度Code概述并查集,故名思议,能合并、能查询的集合,在图的连通性问题和许多算法优化上着广泛的使用。这是一个什么数据结构呢?一般来讲,并查集是由一系列集合组成的集合群。其中,每个集合都有一个根节点,它的......
  • 学习记录,这该死的c++
    最近还是比较懈怠,除了老师布置的作业其他的也是匆匆过一眼至于代码方面最主要的问题还是不理解该怎么表达。总的来说还是要在多沉淀。为什么会有知道敲代码但是不知道该怎么成功表达这个问题啊?还是不能把代码敲得精简一些可以来个人教我怎么敲关系符号吗?运用的还不是很熟练......
  • 【C++贪心】2086. 喂食仓鼠的最小食物桶数|1622
    本文涉及知识点C++贪心LeetCode2086.喂食仓鼠的最小食物桶数给你一个下标从0开始的字符串hamsters,其中hamsters[i]要么是:‘H’表示有一个仓鼠在下标i,或者’.’表示下标i是空的。你将要在空的位置上添加一定数量的食物桶来喂养仓鼠。如果仓鼠的左边或右边......
  • 南沙C++信奥赛陈老师解一本通题 1286:怪盗基德的滑翔翼
    ​【题目描述】怪盗基德是一个充满传奇色彩的怪盗,专门以珠宝为目标的超级盗窃犯。而他最为突出的地方,就是他每次都能逃脱中村警部的重重围堵,而这也很大程度上是多亏了他随身携带的便于操作的滑翔翼。有一天,怪盗基德像往常一样偷走了一颗珍贵的钻石,不料却被柯南小朋友识破了伪......
  • C++之子类继承与父类构造
    C++之子类继承与父类构造文章目录C++之子类继承与父类构造1.问题引出2.原则3.解析3.1单一继承3.1.1父类无参构造函数3.1.1.1子类无定义构造函数3.1.1.2子类定义构造函数3.1.2父类存在无参构造函数和有参构造函数3.1.3父类仅存在有参构造函数3.2链式继承3.3多继承......
  • 【C++】C++中的继承,看这一篇就够了
    【C++】C++中的继承,看这一篇就够了一.继承的概念及定义继承的概念继承定义继承关系和访问限定符继承基类成员访问方式的变化二.基类和派生类对象赋值转换三.继承中的作用域四.派生类的默认成员函数五.继承与友元六.继承与静态成员七.复杂的菱形继承及菱形虚拟继承......