反转链表的四种方法

article/2025/9/23 14:52:36

目录

1.第一种方法:原地反转。

2.第二种方法:利用头插法进行反转链表。

3. 第三种方法:利用迭代法进行反转链表。

 4.第四种方法:利用递归法进行反转链表。

5.应用。


        当我们学习链表之后,就要学习一些链表的操作,而反转链表是我们必备技能,这里总结了链表反转的几种方法,希望可以有用。

1.第一种方法:原地反转

  我们先定义一个结构体。

typedef struct stu{
    int id;
    struct stu*next;
}STU;

        原地反转是通过两个指针对链表进行调整,从而使得链表达到反转的效果,我们可以通过下面的模型来整个链表的操作过程。

为什么需要两个指针呢?

因为在操作的过程中需要取出中间的一个额,这样就会导致后面的数据丢失,当我们有两个指针的时候就可以避免这种情况发生。

注意:在这里我们统一让链表头的不存入数据。

   1.我们首先定义它的头指针为phead,然后我们就可以对我们需要的两个两个指针进行定义。

STU*beg=phead->next;

STU*end=phead->next->next;

   2.当我们定义好这些所需要的指针后,就要进行对数据原地反转的操作了。 

 这个就是我们接下来的思维路线,形象的可以把这四步操作总结为“连”,“掉”,“接”,“移”。

  1. 连:我们将beg->next=end->next,这样就会避免后面的数据丢失。
  2. 掉:接下来将end放在所有数据的前面,就是end->next=head->next。
  3. 连:这个时候就要把连移动的数据放在头指针的后面,即head->next=end。
  4. 移:最后就是要把下一个需要定义的数据往下移动一位,便是end=beg->next。

//下面便是这四步代码

        beg->next=end->next;
        end->next=Pheadlist->next;
        Pheadlist->next=end;
        end=beg->next;

最后我们得到的结果就是

 3.我们很容易的把一个数据给反转了过来,接下来就是要反转后面的所有,我们用的思路都死一样的。

    任然是要使用我们的四步走 ,从而将第三个数据放在最前面。

效果如下:

 

         最后便是将最后一个数据当在最前面,依然熟练的运用前面的方法就行。~~

4.我们可以利用这个方法解决这个反转的问题,但是我们在什么时候停止呢,很容易看出,最后一个就是beg->next==NULL,或者end==时便结束整个循环。

下面就是整个代码

//原地反转链表
STU*Rollback1(STU*Pheadlist)
{STU*beg=Pheadlist->next;STU*end=Pheadlist->next->next;while(end!=NULL){beg->next=end->next;end->next=Pheadlist->next;Pheadlist->next=end;end=beg->next;}return Pheadlist;
}	

以上便是原地反转的所有操作。 

2.第二种方法:利用头插法进行反转链表。

        头插法相信大家都很熟悉了,接下来我们就利用头插法的思想,进行反转链表,同样的我们还是需要两个指针,这样防止后面的数据丢失。

STU*p,*q;

p=phead->next;

q=p->next;

话不多说,我们任然利用图像进行分析。

 1.我们首先将前面的所有东西断开,然后进行后面数据的插入。

phead->next=NULL;

        通过图片我们可以看出是利用四步走,将链表反转。

  1. 利用q将后面的数据连接起来。
  2. 将取出来的数据接到之前链的前面,也就是p->next=head->next;
  3.  让头指针接上取出来的数据。
  4. 数据进行后移。

这四步就是我们整个的核心,接下来是这个步骤所需要的代码。

	    q=p->next;p->next=phead->next;phead->next=p;p=q;

 2.接下来看看后面的图形

         从图中我们可以发现,依然运用了上面的四步,然后使得后面的a3接到了后面。

3.我们利用头插法四步走将链表一一反转,那我们后面是需要怎样操作才可以将这个循环停止呢,很简单,当最后一个数据的下一个数据为空时则停止,便是q==NULL,或者p==NULL;

后面我们写一下这个代码。

STU*Headback(STU*phead)
{STU*p=phead->next;phead->next=NULL;STU*q;while(p!=NULL){q=p->next;p->next=phead->next;phead->next=p;p=q;}return phead;
}

以上便是头插法反转的所有操作。 

3. 第三种方法:利用迭代法进行反转链表。

        咱们先了解一下迭代是什么意思:迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。

迭代就是这样的,有点那懂,但是我们还是可以了解其中的一些信息,我们要将迭代得到的结果会作为下一次迭代的初始值。

那么接下来看看迭代在链表中怎么应用。

依旧上图。

         我们首先需要三个指针,一个是当前节点cur,一个是当前节点的上一个prev,一个是当前节点的next。

    STU*prev=NULL,*next;
    STU*cur=phead->next;

接下来就是一步步转化。

1.我们需要让next指向cur的下一个。

2.把cur的下一个指向上一个。

3.然后就是转化,把上一个指向当前,把当前指向下一个。

我们很清楚的可以了解到,迭代法也是运用四个步骤。

下面就是具体代码。

        next=cur->next;cur->next=prev;prev=cur;cur=next;

那么我们怎么结束这个过程呢,很简单就是让最后一个的下一个不为空,便是cur不为空。

因为我们的头指针都是不存数据的,所以现在我们需要把头指针接到这个新排好的链表上面去。

下边把所有的代码显示出来。

STU*Iterate(STU*phead)
{STU*prev=NULL,*next;STU*cur=phead->next;while(cur!=NULL){next=cur->next;cur->next=prev;prev=cur;cur=next;}phead->next=prev;return phead;
}

以上便是迭代法反转的所有操作。

 4.第四种方法:利用递归法进行反转链表。

递归相信大家都是很熟悉的,所以也就不一一讲解了,就只是说一下需要注意的几个点。

首先我们的代码都是头指针不含有数据的,所以我们需要两个函数。

STU* Reverselist(STU*phead)
{STU*head=phead->next;head=Reverse(head);phead->next=head;return phead;
}

这个就是我们需要转换的一个函数,里面的Reserve便是递归函数所有的代码。

STU*Reverse(STU*head)
{if(head==NULL||head->next==NULL)return head;STU*newhead=Reverse(head->next);head->next->next=head;head->next=NULL;return newhead;
}

这个就是递归的方法。

5.应用。

 这个是力扣上面的一个题,可以利用上面的方法求解。

下面展示一下迭代的方法。

struct ListNode* reverseList(struct ListNode* head){struct ListNode*prev=NULL,*next;struct ListNode*cur=head;while(cur!=NULL){next=cur->next;cur->next=prev;prev=cur;cur=next;}return prev;
}

        以上便是总结的所有方法了。 


http://chatgpt.dhexx.cn/article/0TBQy0lQ.shtml

相关文章

反转链表-四种方法

反转链表 链接 题目:描述 给定一个单链表的头结点head,长度为n,反转该链表后,返回新链表的表头。 以上转换过程如下图所示: 示例1 输入: {1,2,3}返回值: {3,2,1}示例2 输入:…

链表反转的四种方法(栈、头插法、三指针法、递归法)

单链表反转或转置的四种方法 链表的反转实质上是反转链表上的内容: 若链表存储的数据是:1->2->3->4->5; 那么反转后则是:5->4->3->2->1; 下面来介绍链表反转的4种方法:(数据用1->2->3…

IntelliJ IDEA配置JDK

IntelliJ IDEA配置JDK JDK的配置环境变量不再赘述,直接进行IDEA的配置。 1、进入操作界面 file-->project Structure-->platform Settings-->SDKs,进行号操作 2、添加JDK的路径,点击apply按钮,进行ok按钮退出

如何在IDEA中配置不同的Java JDK?

Java的不同版本的JDK之间存在细微的差别,通常比较稳定的版本为JDK8、JDK11.由于在开发不同项目的过程中,我们可能需要在JDK间进行切换。 第一步,Java不同的JDK版本是可以兼容的(无需卸载之前的JDK),我们可…

jdk8 下载 安装 配置及idea配置jdk环境

jdk8 下载 安装与配置 一、下载二、安装三、环境配置四、测试jdk是否安装成功五、idea配置jdk环境 一、下载 下载地址: 链接:https://pan.baidu.com/s/1lkdSc7NmmLQirrLWQ9-Qmg 提取码:9802 二、安装 双击下载的应用程序——>下一步 更…

Intellij IDEA:统一配置JDK版本(JAVA 小虚竹)

❤️作者简介:大家好,我是小虚竹。Java领域优质创作者🏆,CSDN博客专家认证🏆,华为云享专家认证🏆 ❤️技术活,该赏 ❤️点赞 👍 收藏 ⭐再看,养成习惯 Intellij IDEA使用…

安装IDEA的教程以及配置JDK环境变量

安装IDEA的教程以及配置JDK环境变量 安装IDEA的教程配置JDK环境变量 安装IDEA的教程 1.右击ideaIU-2020.2.3.exe ,选择 以管理员身份运行 图1 安装第一步 2.点击Browser… 选择安装位置,然后点击next 图2 修改路径后点next 3.根据您的电脑系统位数选…

IDEA中JDK环境设置

IDEA中JDK环境设置 1 问题描述2 问题分析3 问题解决1 点击File,进入Project Structure2 选择Project, 设置项目jdk环境,如1.8. 再设置项目语言等级8.3 选择Modules模块, 选中当前模块,设置语言登录为8.4 最后从File中,进入Settings中,设置IDEA编译的jdk版本,且设置模块的编译版…

【2023最新】JDK安装 + IDEA配置一条龙

【2023最新】JDK安装IDEA配置一条龙 文章目录 【2023最新】JDK安装IDEA配置一条龙1. JDK81.1 JDK8下载1.2 JDK8安装1.3 JDK8环境变量配置1.4 JDK8测试安装 2. JDK172.1 JDK17下载2.2 JDK17安装2.3 JDK17配置2.4 Java8和Java17版本切换 3. IDEA3.1 IDEA下载3.2 IDEA安装配置3.3 …

IntelliJ IDEA安装与JDK 环境变量配置

IntelliJ IDEA是支持JAVA开发得一种IDE。 安装它需要下载后逐步安装,没什么难点,但是最后会需要一个注册码,网上找个几个都提示过期了,我先用免费30天吧。 然后需要安装JDK和配置环境变量。 一.下载JDK 1.去jdk官网地址&#…

idea如何配置jdk

提前安装jdk,配置环境变量 一、配置jdk 1、依次点开File -->Project Structure,点击左侧标签页,点击SDKs 2、点击号,选SDK 3、在弹出框选择jdk路径(我本地装了两个jdk,大家可以忽略) 4、点…

IntelliJ IDEA中配置JDK(SDK)

1、打开IDEDA,点击File,选择Project Structure。 2、首先,选择左侧栏目中的“SDK”,点击加号,选择我们所需要的“SDK”。—全局级配置 3、接着,选择“Project Setting”中的Project,在SDK处选…

idea和jdk安装与配置

idea和jdk安装与配置 1.下载idea和jdk(步骤待补充文字说明)2.安装idea3.打开idea4.被迫pojie idea5.新建项目6.创建文件7.校验Jdk配置(正确配置)校验(待校验)8.被迫安装jdk1.89.配置jdk1.8环境1.配置JAVA_HOME2.配置CLASSPATH3.配…

使用IntelliJ IDEA 配置JDK(入门)

一、JDK下载 首先要下载java开发工具包JDK,下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 点击如下下载按钮: 在下载页面点击接受许可,并根据自己的系统选择对应的版本,本文以 Windo…

IDEA的安装及JDK环境配置(Java小白入门必备)

“明日之我,心中有丘壑,立马振山河” 前言: 今日给电脑重新装了下IDEA,并且配置了下环境,其中有些步骤我自己也忘记了,废了一番功夫弄好后在这里整理一下,以后可能也会有人不会怎么操作&#x…

IntelliJ IDEA 中如何配置JDK

现在大多数IDE都没有集成JDK环境,IDEA也是一样,在使用IDEA之前首先要安装JDK,并且配置环境变量。与其他IDE不同之处在于,IDEA不会自动匹配系统的JDK环境。如果在IDEA里面没有配置JDK,那么运行程序时就会报错。 这个是…

IDEA 配置Java环境

开发工具与关键技术:IDEA与配置环境 作者:李哲定 撰写时间:2021年5月27日下载jdk和jre RE: Java Runtime Environment JDK:Java Development Kit JRE顾名思义是java运行时环境,包含了java虚拟机&#xff0c…

IntelliJ IDEA 之 配置JDK 的 4种方式

一、新建项目前配置JDK 打开IDEA集成开发环境工具,点击:File--Project Structure,如下图 在打开的页面中,选择SDKs属性,并点击中间的加号,选择JDK,如下图 在打开的页面中,选择本地计…

IntelliJ IDEA之配置JDK的4种方式

IntelliJ IDEA之配置JDK的4种方式 一、新建项目前配置JDK1.打开IDEA集成开发环境工具,点击:File--Project Structure,如下图2.在打开的页面中,选择SDKs属性,并点击中间的加号,选择JDK,如下图3.在…

IDEA安装及配置jdk

1 官网下载安装包 官网这里想要更多功能最好下企业版 2 安装 下载好后按照步骤安装 最后install安装就完成了。 3 配置 点开IDEA 不导入配置 后面就是一些主题肤色设置 可以跳过进去设置也可以在这里设置好。 4 配置JDK 官网下载JDK JDK官网 我这里下载 SE15的 点击D…