一、前言
曾经说出的豪言壮志想要日更刷题, 结果开门不利, 只坚持了两天, 接下里争取安排并补上遗漏的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)))
测试流程示意图
本文内容到此结束了
如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力。
如有错误❌疑问💬欢迎各位大佬指出。
我是 宁轩 , 我们下次再见