【刷题日记】反转链表

44 阅读1分钟

1、 题目描述

😋给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例:

image.png 2、思路

思路历程

由于单链表的缺点 -- 无法回溯,所以一般链表题都使用双指针的方式,一个指向链表前面的节点、另一个指向链表后面的节点。
同理本题中定义双指针,随着后面的指针遍历链表的同时,将节点的指向反转指向前面的节点,然后循环 知道遍历完链表。


image.png


image.png


image.png


3、代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
    	// 前一个指针 - 初始化为 null
        ListNode preNode = null;
        // 当前指针 - 从链表头节点开始
        ListNode curNode = head;
        // 遍历链表
        while(curNode != null){
        	// 如果先反转指向 那么就无法找到当前节点的下一个节点了
        	// 所以先将下一个节点声明出来
            ListNode nextNode = curNode.next;
            // 反转当前节点的指向  指向前一个节点
            curNode.next = preNode;
            // 向后移动 前一个节点的指针
            preNode = curNode;
            // 向后移动 当前节点的指针
            curNode = nextNode;
        }
        return preNode;
    }
}

4、算法分析

复杂度分析

时间复杂度: 遍历了一遍链表,总时间复杂度为 O(n)
空间复杂度: 常量级变量,空间复杂度为O(1)
实际执行耗时与内存占用率:

image.png

5、总结

链表常见的解法就是双指针,一般看到链表题 首先想到创建两个指针然后移动,通常都能找到解法~

建议关注同名微信公众号 以便及时收到最新更新~