题目
给你单链表的头节点 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
进阶: 链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?
思路
这道题比较简单,迭代法总共需要记住三个节点,前继节点,当前节点,后继节点,将前继和后继更换一下位置,核心就三行: 当前节点->next = 前继节点; 当前节点->pre = 后继节点; 当前节点 = 后继节点;
链表反转是算法学习中的重要基础。先扎实掌握经典解法,再循序渐进挑战更高难度的题目。例如后续有两道进阶题型:
- 局部反转(leetcode.cn/problems/re…
- K个一组反转(leetcode.cn/problems/re…)
当基础解法熟练后,这些复杂问题便能迎刃而解。
解答
class Solution {
public ListNode reverseList(ListNode head) {
if (head == null || head.getNext() == null) {
return head;
}
ListNode headCopy = head;
ListNode pre = head;
ListNode cur = head.getNext();
ListNode next;
while (cur != null) {
next = cur.getNext();
cur.setNext(pre);
pre = cur;
cur = next;
}
headCopy.setNext(null);
ListNode newHead = pre;
return newHead;
}
}