「日更刷题」206. 反转链表

简介: 「日更刷题」206. 反转链表

一、前言

曾经说出的豪言壮志想要日更刷题, 结果开门不利, 只坚持了两天, 接下里争取安排并补上遗漏的25道题[苦涩]....

网络异常,图片无法展示
|

废话不多说, 给你一个链表,如何对这个链表进行反转, 本文将分享一种解决方案: 双指针法

二、前置信息

以下前置信息内容内容来自于206. 反转链表 - 力扣(LeetCode)

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例1

网络异常,图片无法展示
|

输入: head = [1,2,3,4,5]
输出: [5,4,3,2,1]
复制代码

示例2

网络异常,图片无法展示
|

输入: head = [1,2]
输出: [2,1]
复制代码

示例3

输入: head = []
输出: []
复制代码

提示

  • 链表中节点的数目范围是 [0, 5000]
  • -5000 <= Node.val <= 5000

链表类

public class ListNode {
    public int val;
    public ListNode next;
    public ListNode() {
    }
    ListNode(int val) {
        this.val = val;
    }
    ListNode(int val, ListNode next) {
        this.val = val;
        this.next = next;
    }
}
复制代码

三、实操

分析一波

首先定义一个 node1 用来作为返回的链表,node2作为记录还有哪个链表没有进行反转, node3作为中转的链表地址记录

依次循环以下步骤:

  • node3 记录node2下一个节点
  • 这个时候 node2就可以用来当作头节点
  • 使用 node2.next = node1来生成最新的一个返回链表
  • 并把这个链表赋值给 node1
  • 在使得 node2 = node3,这个时候我们的中专链表就起作用了
  • 上一步让我们的node2当前节点永远是头节点

具体反转原理可查看标题四、测试下的测试流程示意图

代码如下

public static ListNode reverseList(ListNode head) {
    // 返回链表
    ListNode node1 = null;
    // 当前链表
    ListNode node2 = head;
    // 中转链表
    ListNode node3 = null;
    // 如果当前链表不为 null则继续
    while(node2 != null){
        // 中转链表暂存下一个节点地址, 后续传回 node2
        node3 = node2.next;
        // 因为是反转链表, node2存放 node1的节点地址,
        node2.next = node1;
        // node1获取node2的结构
        node1 = node2;
        // node2 获取中转链表 node3数据
        node2 = node3;
    }
    return node1;
}
复制代码

四、测试

测试代码

public static void main(String[] args) {
    ListNode node1 =  new ListNode();
    node1.val = (1);
    ListNode node2 =  new ListNode();
    node2.val = (2);
    ListNode node3 =  new ListNode();
    node3.val = (3);
    node1.next = (node2);
    node2.next = (node3);
    ListNode node = reverseList(node1);
    System.out.println(node);
}
复制代码

测试结果

ListNode(val=3, next=ListNode(val=2, next=ListNode(val=1, next=null)))
复制代码

测试流程示意图

网络异常,图片无法展示
|



目录
相关文章
|
3月前
|
Python
【Leetcode刷题Python】21. 合并两个有序链表
介绍了几种不同的方法来合并多个已排序的链表,包括暴力求解、使用小顶堆以及分而治之策略。
41 2
|
3月前
|
程序员
【刷题记录】移除链表元素
【刷题记录】移除链表元素
|
3月前
|
索引 Python
【Leetcode刷题Python】328. 奇偶链表
在不使用额外空间的情况下,将链表中的奇数和偶数索引节点重新排序的方法,并提供了相应的Python实现代码。
33 0
|
3月前
|
Python
【Leetcode刷题Python】25.K 个一组翻转链表
解决LeetCode "K 个一组翻转链表" 问题的三种方法:使用栈、尾插法和虚拟节点顺序法,并提供了每种方法的Python实现代码。
31 0
|
3月前
|
Python
【Leetcode刷题Python】114. 二叉树展开为链表
LeetCode上114号问题"二叉树展开为链表"的Python实现,通过先序遍历二叉树并调整节点的左右指针,将二叉树转换为先序遍历顺序的单链表。
27 3
【Leetcode刷题Python】114. 二叉树展开为链表
|
3月前
【刷题记录】链表的回文结构
【刷题记录】链表的回文结构
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
52 5
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 18. 删除链表的节点
Leetcode题目"剑指 Offer 18. 删除链表的节点"的Python解决方案,通过使用双指针法找到并删除链表中值为特定数值的节点,然后返回更新后的链表头节点。
41 4
|
3月前
|
存储 Python
【Leetcode刷题Python】23. 合并K个升序链表
合并K个升序链表的方法:使用数组排序的暴力求解法、使用小顶堆的高效方法,以及分而治之的策略,并提供了相应的Python实现代码。
19 1
|
3月前
|
Python
【Leetcode刷题Python】138. 复制带随机指针的链表
LeetCode上题目“138. 复制带随机指针的链表”的Python解决方案,包括两种方法:一种是在每个节点后复制一个新节点然后再分离出来形成新链表;另一种是构建一个字典来跟踪原始节点与其副本之间的映射关系,从而处理新链表的构建。
20 1