题解 | 反转链表

反转链表

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;
    }
}

全部评论

相关推荐

01-11 08:47
门头沟学院 Java
choumoduji...:读研的目的就是为了以最快的速度和最低的要求完成“学校”规定的毕业标准,而不是所谓课题组的要求
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务