【反转链表】while循环/递归
题意:给定链表表头,反转链表,返回反转链表的表头
【循环】题解:
head维护原链表当前节点,nHead维护反转链表的头节点,nHead置于head前一位,依次后移,直至head到链表尾结束。
双指针循环版本
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ class Solution { public ListNode reverseList(ListNode head) { if(head == null) return null; ListNode nHead = new ListNode(head.val, null); while(head.next != null) { head = head.next; nHead = new ListNode(head.val, nHead); } return nHead; } }
【双指针递归】题解:
一句话总结:每次递归都返回原链表[表头至当前节点]子链表的反转链表的表头!
定义递归函数ListNode reverse(ListNode head, ListNode lastNewHead),
- head:表示原链表的当前节点
- lastNewHead:表示反转链表的当前节点
在原链表中,lastNewHead位于head之前,如下图:
每次迭代更新反转链表的头节点nHead = ListNode(head.val, lastNewHead)
递归:往后移动head和lastNewHead
递归结束标志:遍历到原链表链尾,此时返回反转链表的头节点
双指针递归版本
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ class Solution { public ListNode reverseList(ListNode head) { if(head == null) return null; return reverse(head, null); } public ListNode reverse(ListNode head, ListNode lastNewHead) { ListNode nHead = new ListNode(head.val, lastNewHead); if(head.next == null) return nHead; return reverse(head.next, nHead); } }
【递归妙解】题解2:
一句话总结:每次递归返回原链表[当前节点至链表尾]的局部反转链表的表头!
如下图,原链表的4、5节点已经被反转完成,当前节点为head=3,继续添加3节点至反转链表中,就是使反转链表表头head.next=4的next节点为head=3即可,也就是head.next.next = head
,注意:必须保证原链表表头在反转链表中的next为null!
[注意]:这种方式是在原链表的基础上进行反转的,每个节点的地址没有发生改变!!!!如果后续需要用到原链表则不能用这种方法
妙解!!
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ class Solution { public ListNode reverseList(ListNode head) { if(head == null || head.next == null) return head; ListNode res = reverseList(head.next); head.next.next = head; head.next = null; return res; } }
分类:
算法 / 力扣算法题
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!