简介
题目链接:https://leetcode.cn/problems/reverse-linked-list/description/
解决方式:链表 + 双指针/递归
这是作者学习众多大神的思路进行解题的步骤,很推荐大家解题的时候去看看题解里面大佬们的思路、想法!
推荐查看灵茶山艾府、路漫漫我不畏大佬所作题解。
双指针
解题思路:双指针。一左一右的双指针,右边的指针指向左边的指针,不过需要注意的是不要丢失下一个节点,所以需要暂时存储下一个节点。
java
class Solution {
public ListNode reverseList(ListNode head) {
// 双指针
// cur 上一个节点,pre 前驱节点
ListNode pre = head, cur = null;
// 迭代链表
while(pre != null){
// 存储 pre 节点的指向,即下一个节点,防止后续丢失
ListNode t = pre.next;
// 反转节点指向
pre.next = cur;
// 右移
cur = pre;
pre = t;
}
// 返回数据
return cur;
}
}
递归
解题思路:一直递,直到找到最后一个节点,即,反转之后的头节点。归的时候,往下继续执行代码时,所处状态是最后一个节点的前一个节点而非最后一个节点(第一次归的时候,这需要理解透递归的过程)。通过这个倒数第二的节点拿到下一个节点,设置下一个节点指向当前节点,同时取消当前节点的指向。
java
class Solution {
public ListNode reverseList(ListNode head) {
// 递归终止条件
if(head == null || head.next == null){ // 兼容空链表情况
return head;
}
// 递归公式
// 找到最后一个节点,即反转后的头节点
ListNode revHead = reverseList(head.next);
// 此时,执行 head 是最后一个节点的上一个节点(刚开始归的时候)
// 得到下一个节点
ListNode tail = head.next;
// 下一个节点指向上一个节点,即当前节点
tail.next = head;
// 当前节点的下一个节点指针置为 null,防止循环
head.next = null;
// 返回反转后的头节点
return revHead;
}
}