反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
法一:迭代
- 时间复杂度:O(n),假设 n是列表的长度,时间复杂度是 O(n)。
- 空间复杂度:O(1)。
- 最主要还是有个pre,cur,tmp,然后迭代。
class Solution {public ListNode reverseList(ListNode head) {ListNode pre = null;ListNode cur = head;while (cur != null) {ListNode temp = cur.next;cur.next = pre;pre = cur;cur = temp;}return pre;}}

法二:递归,有点难理解,背答案吧
假设链表是[1, 2, 3, 4, 5]从最底层最后一个reverseList(5)来看
- 返回了5这个节点
- reverseList(4)中
- p为5
- head.next.next = head 相当于 5 -> 4
- 现在节点情况为 4 -> 5 -> 4
- head.next = null,切断4 -> 5 这一条,现在只有 5 -> 4
- 返回(return)p为5,5 -> 4
- 返回上一层reverseList(3)
- 处理完后返回的是4 -> 3
- 依次向上
class Solution {public ListNode reverseList(ListNode head) {if(head == null || head.next == null) return head;ListNode p = reverseList(head.next);head.next.next = head;head.next = null;return p;}}

