#LeetCode每日一题【链表专题】
-
反转链表
https://leetcode-cn.com/problems/reverse-linked-list/ -
分析
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
1——>2——>3——>4——>5
变成
5——>4——>3——>2——>1 -
实现
非递归:一个一个节点的处理,记录上一个节点的位置以及下一个节点的位置,将当前节点的next指向上一个节点
public ListNode reverseList(ListNode head) {
// 反转链表
ListNode prev = null, next;
while (head != null) {
next = head.next;
head.next = prev;
prev = head;
head = next;
}
return prev;
}
LeetCode耗时:0ms
递归:原理一样,将当前节点的next指向为上一个节点
public ListNode reverseList(ListNode head) {
return reverse(head,null);
}
/*
使用递归处理反转链表
*/
public ListNode reverse(ListNode head, ListNode prev) {
if (head == null) {
return prev;
}
ListNode next = head.next;
head.next = prev;
return reverse(next, head);
}
LeetCode耗时:0ms
- 总结:
遍历善于解决从前往后一层层处理的问题,有时候想用递归去实现遍历的活,往往都需要添加一个参数记录从前往后运算的结果;
然而往往使用递归都是在,递归到最深处的时候需要进行一些运算,然后不断向上累加,即向上追溯。