一、前言
曾经说出的豪言壮志想要日更刷题, 结果开门不利, 只坚持了两天, 接下里争取安排并补上遗漏的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))) 复制代码
测试流程示意图
网络异常,图片无法展示
|