Day2 206. 反转链表

本文介绍了两种反转单链表的方法:一是使用双指针的迭代解法,通过定义前指针pre和后指针curr,逐步反转链表;二是采用递归策略,从链表尾部开始,逐次反转节点,最终得到反转后的链表。两种方法都涉及到链表节点的指针操作,理解关键在于如何正确地调整节点间的连接关系。
摘要由CSDN通过智能技术生成

难度:简单
题目描述:
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。在这里插入图片描述

提示:

  • 链表中节点的数目范围是 [0, 5000]
  • -5000 <= Node.val <= 5000

警告:再往下翻就是答案了


解法1:双指针,迭代实现

  • 定义两个指针: prepre 和 curcur ;prepre 在前 curcur 在后。
  • 每次让 prepre 的 nextnext 指向 curcur ,实现一次局部反转
  • 局部反转完成之后,prepre 和 curcur 同时往前移动一个位置
  • 循环上述过程,直至 prepre 到达链表尾部
//双指针迭代实现
class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode pre = null;//前指针初始指向头结点的前一个空结点
        ListNode curr=head;//后指针初始指向头结点
        ListNode next;//定义一个变量来临时存放二三节点的指向,以找到后一个结点位置
        while(curr!=null){
            next = curr.next;
            curr.next = pre;
            pre = curr;
            curr = next;
        }
        return pre;//因为后指针移动到了末尾,但链表反转了,故此处才是头。
    }
}

解法2:递归实现

  • 使用递归函数,一直递归到链表的最后一个结点,该结点就是反转后的头结点,记作 retret
  • 此后,每次函数在返回的过程中,让当前结点的下一个结点的 next.next 指针指向当前节点。
  • 同时让当前结点的 nextnext 指针指向 NULL ,从而实现从链表尾部开始的局部反转
  • 当递归函数全部出栈后,链表反转完成。
// 递归实现
class Solution {
    public ListNode reverseList(ListNode head) {
        if(head == null || head.next == null)//递归开始前先判断传入的是否为空链表及是否遍历到尾部
            return head;
        ListNode retret = reverseList(head.next);//开始递归,传入head.next保证获得下一个结点
        head.next.next = head;//这两步是将两个结点间的指向反转
        head.next = null;
        return retret;
    }
}

碎碎念时间:
解法1注意要找个变量来存第三个结点的位置,不然反转12结点之后就没办法找到下一个结点
解法2也是没法解决找下一个结点的问题,所以干脆从尾部遍历,这样前面的指向还没有被破坏。
多画图,画个图比看字容易理解。

跳转:https://leetcode.cn/problems/reverse-linked-list/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值