剑指 Offer 24. 反转链表

314 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

一、题目描述

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

示例

示例1:

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

提示

限制: 0 <= 链表长度 <= 10000

难度:简单

此题为简单题,兄弟们可以重拳出击,没错,就是你想到的那种方法,简单粗暴!

二、思路分析

众所周知,力扣上,简单题是真简单,中等题有些困难,困难题看不懂答案。

题目解析

  1. 题目需要实现链表的反转,最简单直接的方法就是在迭代遍历链表的同时,将链表的节点指向进行反转,并返回最后一个非空结点。
  2. 需要注意的是,在遍历节点的同时反转链表,则需要记录当前结点、当前结点的前驱结点和后置结点,后置结点可以通过 next 指针获取,而前驱结点则需要使用变量存储。

解题思路

链表反转的主要实现流程为:

  1. 初始化结点变量,当前结点变量 cur=head; 前驱和后置结点变量 pro=next=null;
  2. 使用循环对于链表种所有结点执行反转操作,pro 初始化为 null 保证所有结点统一操作
    • 从当前 head 结点开始,先记录当前结点的后置结点 next=cur.next;
    • 然后将当前结点指向前驱结点 cur.next=pro;
    • 当前结点操作完之后,当前结点成为前驱结点 pro=cur;
    • 后置结点成为下一个当前结点 cur=next;
  3. 当前结点为 null 时循环结束,此时当前结点的前驱结点 pro 作为初始链表最后一个结点,也是新链表的第一个结点,返回即可。

三、AC 代码

链表节点结构定义

// Definition for singly-linked list.
public class ListNode {
   int val;
   ListNode next;
   ListNode(int x) { val = x; 
}

实现逻辑代码

  1. 两个临时变量依次反转链表
public ListNode reverseList(ListNode head) {
    // 定义变量存放前驱、当前、后置结点
    ListNode pro, cur, next;
    pro = null;
    cur = head;
    while(cur != null){
        next = cur.next;
        // 更改当前结点指向
        cur.next = pro;
        pro = cur;
        cur = next;
    }
    return pro; 
}

image.png

四、总结

知识点

  • 链表关键词:前驱结点、后置结点
  • 链表节点操作:链表结点向前移动、链表指针反转

最后

阳春三月,算法刷起来!LeetCode 剑指 Offer

简单题,不需要考虑太多,开干就是了。