【手撕算法】反转链表

本文详细介绍了两种链表翻转的方法,包括经典的迭代法和递归法。迭代法通过双指针操作,利用临时变量辅助完成链表节点的反转。递归法则通过递归调用来实现,每次反转链表的最后两个节点,直至链表为空或只剩一个节点。这两种方法都能有效地完成链表的反转操作。
摘要由CSDN通过智能技术生成
  1. 迭代
    1. 做法经典双指针,用一个temp指针当临时变量,占住cur.next的坑(占住cur正数的后一项)。
    2. 让pre成为cur的后一项,把cur的值给pre,把temp的值给cur,这样实现往后移了。
    3. 最后pre指向最后一个结点而cur指向他下一处,即null。
         ListNode pre=null;
        ListNode cur=head;
        ListNode temp=null;
        while(cur!=null)
        {
        	//因为一会要把cur的下一个节点指向pre,所以先保存原链表的节点值
            temp=cur.next;
            //先确立连接关系 否则Error - Found cycle in the ListNode
            cur.next=pre;
            pre=cur;
            cur=temp;
        }
        return pre;
        
    
  2. 递归法

class Solution {
    public ListNode reverseList(ListNode head) {
        //判断递归结束的条件是当前节点或他的下一个节点为空
        if(head==null||head.next==null)
        {
            return head;
        }
        //若链表为1->2->3->4->5,那么此时的last节点,即head.next 也就是原链表的最后一个节点,即5
        //head.next是第一个节点
        ListNode last=reverseList(head.next);
        //此时原本的head节点为4,那么接下来要做的就是链表倒置。
        //每次只倒置原链表的最后两个节点,也就是倒置后新链表的前两个节点
        //4.next==5,4.next.next==5.next,那么我们把5.next赋值为4,这样完成了4->5到5->4的反转
        head.next.next=head;
        //此时4在链表尾了,新产生的链表还没有定义,要防止它循环,所以先把他后面的节点head.next赋值为null
        head.next = null;
        //实际上每层调用都返回了last,即最后一个节点
        //那么我们发现在这个题里,last一直都是原来链表的尾节点5,原因是递归调用改变的是head,而最后指向的新的链表的链表头还是原来的最后一个节点
        return last;
        

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值