后面的链表题中也会出现“反转链表”思想的使用 所以这个题一定要非常熟练奥!
只要掌握了 维护pre指针和cur指针(下面有图)的技巧 这题就迎刃而解了!
206. 反转链表
又是一道三刷的题啊
可以看出 链表问题是相当高频的哦!
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
示例 1:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例 2:
输入:head = [1,2]
输出:[2,1]
示例 3:
输入:head = []
输出:[]
解题思路与代码
leetbook上给的思路让我遍历链表 然后将当前节点的下一个节点扔到最前面去(我尝试了一下 没搞出来。。超时了 这里留个坑 回头来填
对链表的操作还是不熟悉!!
双指针迭代链表
利用双指针很好解决!
之前我写过这题的题解 可以参考下
(下面还没看懂的 这里面有图解的说 感谢王尼玛提供的题解~)
这个思路也是普适性最强的!
既然要我们把链表翻转过来 就让链表每个节点的指向都换个方向咯!
【1】定义两个指针 一前一后 每次让后面的指针指向前面的 实现局部的反转
ListNode prev = null;//在前面的指针
ListNode curr = head;//在后面的指针 要让它指向prev实现局部反转
【2】每次迭代过程都要预存一下后面那个指针对应节点的下一个节点 为了达到“前后两个节点在反转后 前后两个指针向下挪 继续进行局部反转的工作”
ListNode next = curr.next;//存储下curr的下一个位置~
Java代码
class Solution {
public ListNode reverseList(ListNode head) {
ListNode prev = null;//在前面的指针
ListNode curr = head;//在后面的指针 要让它指向prev实现局部反转
while(curr != null){
ListNode next = curr.next;//存储下curr的下一个位置~
curr.next = prev;
//至此 局部反转完成 接下来分别完成两个指针的后移
prev = curr;
curr = next;
}
return prev;
}
}
递归法
借鉴了评论区里一位大佬的代码
写得真的很好!
class Solution {
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
// 想象递归已经层层返回,到了最后一步
// 以链表 1->2->3->4->5 为例,现在链表变成了 5->4->3->2->null,1->2->null(是一个链表,不是两个链表)
// 此时 newHead是5,head是1
ListNode newHead = reverseList(head.next);
// 最后的操作是把链表 1->2->null 变成 2->1->null
// head是1,head.next是2,head.next.next = head 就是2指向1,此时链表为 2->1->2
head.next.next = head;
// 防止链表循环,1指向null,此时链表为 2->1->null,整个链表为 5->4->3->2->1->null
head.next = null;
return newHead;
}
}