算法基础——链表反转

article/2025/9/23 12:38:27

一、单链表反转

(1)创建单链表结构类

public class Node {public int value;//当前节点的值public Node next;//next储存下一个节点地址值public Node(int value) {this.value=value;}
}

    不知道有没有小伙伴像我一样的疑惑,为什么单链表结构类中的成员变量有个Node next?后面经常思考我发现next的作用是储存下一个节点的地址值,即通过访问当前节点的next属性即可寻找到下一个节点。它的创建方式可以理解为回调函数的方式,创建一个node类对象时,该对象中的next默认走无参构造进行初始化,因此初始值是null。

(2)创建单链表结构变量

	Node head=new Node(1);head.next=new Node(2);head.next.next=new Node(3);

(3)反转函数

public static Node reverse(Node head){Node next=null;Node pre=null;//循环步while(head !=null) {//next指针移后,保存下一个节点地址,防止由于当前节点的指针更改导致下一个节点地址丢失。next = head.next;//反转当前节点指针(原->,更改<-)head.next=pre;//指针指向更改完毕,调整当前节点顺序pre=head;//pre上前head=next;//head移后}return pre;
}

上述代码中,next的作用是保存当前节点的下一个节点地址,而pre的作用是保存当前节点的上一个节点地址

(4)测试

Node n1=new Node(1);
n1.next=new Node(2);
n1.next.next=new Node(3);
System.out.println("倒序前"+n1);
//调用倒序函数
Node reverse = reverse(n1);
System.out.println("倒序前"+reverse);

(4)倒序流程:

首先三个变量(pre,head,next),循环条件while(head !=null),其中pre和next初始为null,head为传入的参数,也是头节点,pre和next是用于保存节点位置,防止由于当前节点指针的更改而导致当前节点记录的其它节点地址丢失,pre保存head的前一个节点地址,next保存head的下一个节点地址。

循环步:第一步保存当前节点内的下一个节点地址,代码实现为next=head.next;第二步反转当前节点的指向,代码实现为head.next=pre;第三步,调序,head后移,主要表现为pre到达当前head位置,head再到达当前next位置,代码实现为pre=head,head=next。最后重复以上三步直到循环结束。

整体倒序代码流程可见下图:

二、双链表反转

双链表反转和单链表相似,这里就不做详细论述。

(1)创建双链表结构类


public DoubleNode last;
public DoubleNode next;
public int value;public DoubleNode(int value) {this.value = value;
}

双链表结构简图如下(为方便只画了两个节点)

 (2)倒序函数

public static DoubleNode reverseDoubleNode(DoubleNode head){DoubleNode pre=null;DoubleNode next=null;//循环步while (head !=null) {//保存下一个节点地址next = head.next;//反转指向head.next = pre;head.last = next;//调整顺序pre = head;head = next;}return pre;//head=null;head的前一个节点pre的地址即最后一个节点地址,即新的头结点地址
}

 具体代码实现流程图:

 三、总结

        从中可以看出不管是单链表还是双链表,反转的逻辑步骤都一样,首先保存当前节点的下一个节点的地址值,防止因当前节点指向更改而丢失,然后更改当前节点的指向,单链表只更改next,而双链表还要更改last,最后再调整节点顺序(获取下一个节点地址值),pre在前head在中,last在后的结构,最后循环结束返回pre即最后一个节点地址,即新的头节点。


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

相关文章

链表反转(C++)

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

详解:链表反转

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

链表反转【递归法】

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

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

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

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

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

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

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

Java之链表的反转

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

Golang 实现【链表反转】

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

链表反转

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

使用递归实现链表反转

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

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

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

C语言 单链表的反转

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

详解反转链表

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

详解链表反转问题

文章目录 链表反转问题详解前言一、整个链表反转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.第一种方法&#xff1a;原地反转。 2.第二种方法&#xff1a;利用头插法进行反转链表。 3. 第三种方法&#xff1a;利用迭代法进行反转链表。 4.第四种方法&#xff1a;利用递归法进行反转链表。 5.应用。 当我们学习链表之后&#xff0c;就要学习一些链表的操作&am…

反转链表-四种方法

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

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

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

IntelliJ IDEA配置JDK

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

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

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

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

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