反转链表笔记

反转链表

解法1:迭代,重复某一过程,每一次处理结果作为下一次处理的初始值,这些初始值类似于状态、每

次处理都会改变状态、直至到达最终状态

从前往后遍历链表,将当前节点的next指向上一个节点,因此需要一个变量存储上一个节点prev,当前

节点处理完需要寻找下一个节点,因此需要一个变量保存当前节点curr,处理完后要将当前节点赋值给

prev,并将next指针赋值给curr,因此需要一个变量提前保存下一个节点的指针next

在这里插入图片描述

1、将下一个节点指针保存到next变量 next = curr.next

2、将下一个节点的指针指向prev,curr.next = prev

3、准备处理下一个节点,将curr赋值给prev

4、将下一个节点赋值为curr,处理一个节点

public static ListNode iterate(ListNode head){ 
    ListNode prev = null,curr,next; 
    curr = head; 
    while(curr != null){ 
        next = curr.next; 
        curr.next = prev; 
        prev = curr; 
        curr = next; 
    }
    return prev; 
}

解法2:递归:以相似的方法重复,类似于树结构,先从根节点找到叶子节点,从叶子节点开始遍历

大的问题(整个链表反转)拆成性质相同的小问题(两个元素反转)curr.next.next = curr

将所有的小问题解决,大问题即解决

在这里插入图片描述

只需每个元素都执行curr.next.next = curr,curr.next = null两个步骤即可

为了保证链不断,必须从最后一个元素开始

public static ListNode recursion(ListNode head) { 
    if (head == null || head.next == null) { 
        return head; 
    }
    ListNode newHead = recursion(head.next); 
    head.next.next = head; 
    head.next = null; 
    return newHead; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值