题目地址(206. 反转链表)

https://leetcode-cn.com/problems/reverse-linked-list/

题目描述

  1. 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
  2. 示例 1
  3. 输入:head = [1,2,3,4,5]
  4. 输出:[5,4,3,2,1]
  5. 示例 2
  6. 输入:head = [1,2]
  7. 输出:[2,1]
  8. 示例 3
  9. 输入:head = []
  10. 输出:[]
  11. 提示:
  12. 链表中节点的数目范围是 [0, 5000]
  13. -5000 <= Node.val <= 5000
  14. 进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?

前置知识


公司

  • 暂无

思路

只需要改变链表的next指针的指向,直接将链表反转 ,而不用重新定义一个新的链表
008eGmZEly1gnrf1oboupg30gy0c44qp.gif

关键点


代码

  • 语言支持:Java

Java Code:

  • 双指针法

    1. class Solution {
    2. public ListNode reverseList(ListNode head) {
    3. //前指针指向一个虚拟的节点 值为空
    4. ListNode pre = null;
    5. ListNode cur = head;
    6. //定义一个临时节点 存放cur.next 不然这个值在更改了cur的指向后就会丢失
    7. ListNode tempNode = head;
    8. while (cur != null) {
    9. //先保存下一个节点
    10. tempNode = cur.next;
    11. //反转
    12. cur.next = pre;
    13. //更新prev、cur位置
    14. pre = cur;
    15. cur = tempNode;
    16. }
    17. return pre;
    18. }
    19. }
  • 递归法

  1. /**
  2. * Definition for singly-linked list.
  3. * public class ListNode {
  4. * int val;
  5. * ListNode next;
  6. * ListNode() {}
  7. * ListNode(int val) { this.val = val; }
  8. * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
  9. * }
  10. */
  11. class Solution {
  12. public ListNode reverseList(ListNode head){
  13. return reverse(null, head);
  14. }
  15. public ListNode reverse(ListNode pre,ListNode cur) {
  16. if (cur == null) {
  17. return pre;
  18. }
  19. ListNode tempNode = null;
  20. tempNode = cur.next;
  21. cur.next = pre;
  22. pre = cur;
  23. cur = tempNode;
  24. return reverse(pre, cur);
  25. }
  26. }

复杂度分析

令 n 为数组长度。

  • 时间复杂度:206. 反转链表(2) - 图2#card=math&code=O%28n%29&id=Y9AVE)
  • 空间复杂度:206. 反转链表(2) - 图3#card=math&code=O%28n%29&id=B4IG9)