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

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

示例 3:
提示:
- 链表中节点的数目范围是
[0, 5000]
-5000 <= Node.val <= 5000
进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?
直接交换法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class Solution { public ListNode reverseList(ListNode head) { if(head == null || head.next == null){ return head; } ListNode pre = null; ListNode cur = head; ListNode temp = null; while(cur != null){ temp = cur.next; cur.next = pre; pre = cur; cur = temp; } head = pre; return head; } }
|
递归
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class Solution { public ListNode reverseList(ListNode head) { return reverse(null, head); }
private ListNode reverse(ListNode pre, ListNode cur) { if (cur == null) { return pre; } ListNode temp = null; temp = cur.next; cur.next = pre; return reverse(cur, temp); } }
|
头插法(带头节点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class Solution { public ListNode reverseList(ListNode head) { if(head == null || head.next == null){ return head; } ListNode dummy = new ListNode(-1); dummy.next = head; ListNode cur = head.next; head.next = null; ListNode temp = null; while(cur != null){ temp = cur.next; cur.next = dummy.next; dummy.next = cur; cur = temp; } return dummy.next; } }
|