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

 

示例 1:

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

示例 2:

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

示例 3:

输入:head = []
输出:[]

 

提示:

  • 链表中节点的数目范围是 [0, 5000]
  • -5000 <= Node.val <= 5000

 

进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?

Related Topics
  • 递归
  • 链表

  • 👍 2019
  • 👎 0
  • 结合上一篇LeetCode刷题【剑指 Offer 24】反转链表一起看,是同一个问题,不过这里不用迭代遍历了

    class Solution {
    
        ListNode preNode;
        ListNode tail;
        public ListNode reverseList(ListNode head) {
            if (head == null || head.next == null){
                return head;
            }
            preNode = head;
            nextNode(head.next);
            head.next = null;
            return tail;
        }
    
    
        public void nextNode(ListNode node){
            if (node == null){
                tail = preNode;
                return;
            }
            ListNode next = node.next;
            node.next = preNode;
            preNode = node;
            nextNode(next);
        }
    }

    这是递归的方法,不过本质上还是和遍历迭代是一样的

    • 在递归的过程中记录上一个递归到的节点preNode
    • 把当前节点的next指向之前记录的preNode
    • 把preNode指向当前节点
    • 继续处理next节点
    • 别忘了头结点的next指向也要清除掉