1、 题目描述
😋给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例:
2、思路
思路历程
由于单链表的缺点 -- 无法回溯,所以一般链表题都使用双指针的方式,一个指向链表前面的节点、另一个指向链表后面的节点。
同理本题中定义双指针,随着后面的指针遍历链表的同时,将节点的指向反转指向前面的节点,然后循环 知道遍历完链表。
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)
实际执行耗时与内存占用率:
5、总结
链表常见的解法就是双指针,一般看到链表题 首先想到创建两个指针然后移动,通常都能找到解法~
建议关注同名微信公众号 以便及时收到最新更新~