206.反转链表
目录
- 206.反转链表
- 题目
- 题解-迭代
- 题解-递归
206.反转链表
题目
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例 1:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
输入:head = [1,2]
输出:[2,1]
示例 3:
输入:head = []
输出:[]
提示:
链表中节点的数目范围是 [0, 5000]
-5000 <= Node.val <= 5000
进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解-迭代
翻转肯定需要两个指针,pre -> cur (-> next )换成 pre<-cur (next),当cur指向pre后,next断链了,为了防止断链,我们还需要保存下来next。更新pre和cur进行下一次翻转
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
ListNode pre=null;
ListNode tmp;
while(head!=null){
tmp = head.next; //防止断链,记录下要反转的节点的后一个节点
head.next = pre; //开始反转指向前一个
pre = head;
head = tmp;
}
return pre;
}
}
题解-递归
迭代是从前往后处理,递归则是先递到最后,再从最后归回来。
递归三部曲
递归终止条件
什么时候停止递归?反转链表,链表至少有2个元素,如果只有一个节点或者空节点就停止递归。
这里的返回值是什么呢?
返回反转后的头节点。
if(head==null || head.next == null){
return head; //递归终止,遍历到了最后一个元素这个就是反转后的头节点或者当前链表为空
}
递归的参数和返回值
递归的返回值就是反转后头节点,也就是终止条件返回的节点,那么将这个返回值层层传递就行了。
递归的参数是单链表的头节点。
public ListNode reverseList(ListNode head)
本层递归的逻辑
ListNode ret = reverseList(head.next);
head.next.next = head;
head.next = null;
return ret; //层层传递反转后的头节点
代码
class Solution {
ListNode pre =null;
public ListNode reverseList(ListNode head) {
if(head == null) return null;
ListNode temp = head.next;
head.next = pre;
pre = head;
reverseList(temp);
return pre;
}
}
题解中的整个流程图,便于理解递归。