题解 | 反转链表
反转链表
https://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca
import java.util.*;
/*
* 链表节点定义类(题目给定,无需修改)
* public class ListNode {
* int val; // 节点存储的数值
* ListNode next = null; // 指向下一个节点的指针
* public ListNode(int val) { // 节点构造方法
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 反转单链表的核心方法(迭代法)
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param head ListNode类 传入的链表头节点(链表的第一个节点)
* @return ListNode类 反转后的链表头节点(原链表的最后一个节点)
*/
public ListNode ReverseList (ListNode head) {
// 1. 边界条件处理:如果传入的链表为空(头节点为null),直接返回null
if(null == head) {
return null;
}
// 2. 定义三个指针,用于迭代反转链表(核心)
ListNode preNode = null; // 前驱节点:记录当前节点的上一个节点(初始为null,因为反转后头节点的next为null)
ListNode currentNode = head; // 当前节点:从链表头节点开始遍历
ListNode postNode = head.next; // 后继节点:记录当前节点的下一个节点(防止反转后链表断链)
// 3. 循环迭代反转链表,直到后继节点为null(当前节点走到链表最后一个节点)
while(null != postNode) {
currentNode.next = preNode; // 核心操作:反转当前节点的指向(指向它的前驱节点)
preNode = currentNode; // 前驱节点后移:更新为当前节点,准备处理下一个节点
currentNode = postNode; // 当前节点后移:更新为后继节点
postNode = postNode.next; // 后继节点后移:更新为下一个节点(直到为null)
}
// 4. 处理最后一个节点:循环结束时currentNode是原链表最后一个节点,需指向它的前驱节点
currentNode.next = preNode;
// 5. 返回反转后的链表头节点(原链表最后一个节点)
return currentNode;
}
}
