链表反转详解图解

article/2025/9/23 12:40:16

在实现反转之前,先回顾链表操作的一些重点。

现链表节点是以下形式:

struct Node {int data;Node* next;
};

解决链表问题一定要理解深刻,一些要注意的点:

链表中每一个节点都是物理内存中实际存在的,物理节点本身是固定不变的,给定了地址就在那个地址中不会转移、变化等,链表之所以能够添加,删除,反转等,本质是指向这些物理节点的指针节点在移动,即给物理节点赋予的指针是变化的,而我们进行链表操作实际上是操作这些指针节点。

拿一个例子做说明:假设已经建立一个链表,名为list,它也代表链表的头结点:

蓝色方框表示的是物理内存中实际存在的节点,我在方框下方标注了他们所处的内存地址(橙色)。我用名为list的指针(绿色方框)表示指向这片具有逻辑顺序关系的链表。

理解1:一旦链表已经形成,通过对头节点操作,可以索引出链表中所有的节点,并且是基于箭头所指方向进行索引的!也就是说只能说单向的,箭头的含义其实就在于这里-单向。拿这个链表再作解释:

通过

list = list->next

List所指向的节点到了值为2的物理内存上。这样以后,没有建立其他辅助节点指针的条件下,List就再也不具备能力回到值为1的那个物理节点上,这就是单向的意义。List继续可以往后索引。

那么对于链表反转,我们想要实现的就是从上面的链表形式转换成如下的形式,什么改变了,很明显,箭头反过来了。箭头变了,意味着next指向的地址也要反过来!

先给出实现代码:

Node* ReverseList(Node* list)
{Node* tmpNode = list;Node* preNode = nullptr;while (tmpNode){Node* nextNode = tmpNode->next;tmpNode->next = preNode;preNode = tmpNode;tmpNode = nextNode;}list = preNode;return list;
}

一条一条语句分析:

Node* tmpNode = list;

增加一个辅助指针,也可以说辅助节点吧,为了方便,后面提的“节点”都表示为“指向节点的指针”,区分物理节点。

Node* preNode = nullptr;

进入循环中依次索引链表中的节点。

1:Node* nextNode = tmpNode->next;

2:tmpNode->next = preNode;

3-4:

        preNode = tmpNode;
        tmpNode = nextNode;

第二次:

        Node* nextNode = tmpNode->next;
        tmpNode->next = preNode;

此时发现,箭头反过来了,这正不是我们想要的,tmpNode和preNode继续往后推,

        preNode = tmpNode;
        tmpNode = nextNode;

现在要做的不就把tmpNode->next指向preNode不就完事了

        Node* nextNode = tmpNode->next;
        tmpNode->next = preNode;

到这里基本上结束了,把preNode赋给list,完成。


http://chatgpt.dhexx.cn/article/xOmZT9ds.shtml

相关文章

Java链表-链表反转

基本思想 定义两个空指针(pre和next),如果头指针指的值不为空,就让next存头节点的下一个节点的值(head.next),再把pre指针的值赋到head.next,再把头节点的值赋到pre,再把…

算法基础——链表反转

一、单链表反转 (1)创建单链表结构类 public class Node {public int value;//当前节点的值public Node next;//next储存下一个节点地址值public Node(int value) {this.valuevalue;} } 不知道有没有小伙伴像我一样的疑惑,为什么单链表结构…

链表反转(C++)

思路图 这是在刷 LeetCode 看到的一个方法,我觉得特别简单好记,不管单链表还是双链表上来p1、p2、p3 直接反转。 代码实现 单链表反转 struct ListNode {int val;ListNode *next;ListNode() : val(0), next(nullptr) {}ListNode(int x) : val(x), n…

详解:链表反转

链表反转是链表算法题中较为基础的一道题,但对于初学者来说,由于对链表的结构不是很熟悉,一时间无从下手,甚至看别的的阶梯代码都会觉得很晕,看不懂一堆变量都是做什么的。我将会详细描述链表反转的操作,希…

链表反转【递归法】

目录 前言一、解题思路1.找到链表的尾部两个数据(4、5)2.创建逆向指针3.断开正向指针4.递归5.递归的具体过程向前移动:第一次:创建逆向指针:断开正向指针: 第二次:创建逆向指针:断开…

【C++】3.数据结构与算法:链表反转

链表反转是C面试经常会考的一道题目,下面介绍2种解法,分别是非递归法和递归法。 理论 1.非递归法(迭代反转) 创建3个指针pre cur nex,每个循环指针各向后移动一个节点。 2.递归法 通过不断压栈,然后退栈…

C语言实现链表反转(上)

链表反转是非常经典的题目,这里让我们用C语言来实现一下链表的反转 这里以无头不循环单向链表为例子(因为这是链表中用的比较多的链表结构) 这里首先我们先定义一个链表结构 方法一:用三个指针来实现指针的反转: 1.…

Java实现链表反转的两种思路

Java实现链表反转的两种思路 题目迭代递归 题目 将单链表的连接顺序反转过来 输入:1->2->3->4->5 输出:5->4->3->2->1 迭代 迭代,即遍历整个链表的节点,在每个节点上进行操作。每个节点之间都需要进行三个步骤:1.保…

Java之链表的反转

反转API设计: public void reverse():对整个链表反转 public Node reverse(Node curr):反转链表中的某个结点,并把反转后的curr结点返回 使用递归可以完成反转,递归反转其实就是从原链表的第一个存数据的结点开始,依次递归调用反转…

Golang 实现【链表反转】

题目 Golang 实现【链表反转】 如何反转一个单链表。 题目示例 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 链表结构 type ListNode struct {Val intNext *ListNode }第一种实现 解题思路: 利用指针交互的思路 复杂度…

链表反转

转载:https://blog.csdn.net/fx677588/article/details/72357389 因本人日常是java开发,所以翻译成java语言代码,略有改动 链表的翻转是程序员面试中出现频度最高的问题之一,常见的解决方法分为递归和迭代两种。最近在复习的时候…

使用递归实现链表反转

链表反转(图解) 文章目录 链表反转(图解)前言一、链表反转二、递归思想三、具体实现1.反转方法API2.具体实现代码3.方法测试 四、方法调用过程总结 前言 链表反转是面试中的一个高频题目,可以通过多种方法实现&#x…

单向链表的反转(c++实现)

目录 前言单向链表的反转实现代码 总结更新 前言 本篇文章接着前文单链表的插入、删除(c实现)实现链表的反转,主要也即是在前文的基础上完成了一个InvertList()函数。 单向链表的反转 通过前面两篇文章的学习,已经对于链表的操…

C语言 单链表的反转

C语言 单链表的反转 一、简述 记--简单的将单链表的数据顺序进行反转。如将原来的顺序1 2 3 4 5 6 7 反转为:7 6 5 4 3 2 1 二、方式1:头插法 2.1 头插法1--类似新建链表 2.1.1 思路:断开链表头,然后以头插法的方式将原链表的数…

详解反转链表

LeetCode链接 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 情况一:头结点为空 情况二:链表只有一个节点 情况三:链表多于1个节点。 思路:让当前节点指向前一个节点。 如何才能做到当前…

详解链表反转问题

文章目录 链表反转问题详解前言一、整个链表反转1.栈2.头插法3.递归4.三指针法以上部分参考链接: 链接: [link](https://blog.csdn.net/Ezrealwj/article/details/119702058?ops_request_misc%257B%2522request%255Fid%2522%253A%2522166744018216782428679986%2522%252C%2522…

反转链表的四种方法

目录 1.第一种方法:原地反转。 2.第二种方法:利用头插法进行反转链表。 3. 第三种方法:利用迭代法进行反转链表。 4.第四种方法:利用递归法进行反转链表。 5.应用。 当我们学习链表之后,就要学习一些链表的操作&am…

反转链表-四种方法

反转链表 链接 题目:描述 给定一个单链表的头结点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按钮退出