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

156 阅读1分钟

一、前言

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

image.png

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

二、前置信息

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

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

示例1

image.png

输入: head = [1,2,3,4,5]
输出: [5,4,3,2,1]

示例2

image.png

输入: 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)))

测试流程示意图

image.png

本文内容到此结束了

如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力。

如有错误❌疑问💬欢迎各位大佬指出。

我是 宁轩 , 我们下次再见