206、反转链表
重点:循环体需要临时tmp保存下个节点
- 双指针:设置虚拟节点,双指针pre,cur,进行翻转,知道cur==null
- 递归:递归三部曲
方法一:双指针
public ListNode reverseList(ListNode head) {
//需要指向的元素
ListNode pre = null;
//当前元素
ListNode cur = head;
ListNode tmp = null;
while (cur != null) {
//临时值
tmp = cur.next;
//当前指针翻转
cur.next = pre;
//移动指针
pre = cur;
cur = tmp;
}
//此时cur->null ,pre 是最后一个
return pre;
}
方法二:递归
- 确定入参和出参(一般为vido)
- 确定停止条件
- 单个循环体
public ListNode reverseList(ListNode head) {
return reverse(null, head);
}
private ListNode reverse(ListNode prev, ListNode cur) {
if (cur == null) {
return prev;
}
ListNode temp = null;
temp = cur.next;// 先保存下一个节点
cur.next = prev;// 反转
return reverse(cur, temp);
}