/**
Given the head of a singly linked list, reverse the list, and return the
reversed list.
Example 1:
Input: head = [1,2,3,4,5]
Output: [5,4,3,2,1]
Example 2:
Input: head = [1,2]
Output: [2,1]
Example 3:
Input: head = []
Output: []
Constraints:
The number of nodes in the list is the range [0, 5000].
-5000 <= Node.val <= 5000
Follow up: A linked list can be reversed either iteratively or recursively.
Could you implement both?
Related Topics递归 | 链表
👍 2757, 👎 0
*/
//leetcode submit region begin(Prohibit modification and deletion)
/**
* 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) {
if (head == null) {
return head;
}
Pair<ListNode, ListNode> headTail = reverseInner(head);
headTail.getValue().next = null;
return headTail.getKey();
}
private Pair<ListNode, ListNode> reverseInner(ListNode node) {
if (node == null || node.next == null) {
return new Pair<>(node, node);
}
Pair<ListNode, ListNode> headTail = reverseInner(node.next);
headTail.getValue().next = node;
return new Pair<>(headTail.getKey(), node);
}
}
//leetcode submit region end(Prohibit modification and deletion)