赞
踩
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
示例 1:
输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]
示例 2:
输入:head = [1,2] 输出:[2,1]
示例 3:
输入:head = [] 输出:[]
提示:
链表中节点的数目范围是 [0, 5000]
-5000 <= Node.val <= 5000
进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?
链表的反转我目前掌握了3种方法,首先是最熟悉的
创建一个新的虚拟头节点,遍历原来的链表进行链表的反转
class Solution { public ListNode reverseList(ListNode head) { ListNode newhead = new ListNode(-1); ListNode op = head; while(op!=null) { ListNode temp = op.next; op.next = newhead.next; newhead.next = op; op = temp; } return newhead.next; } }
额外写一个递归函数,从原链表的头节点开始递归
思路跟双指针差不多
class Solution { public ListNode reverseList(ListNode head) { return reserve(null,head); } public ListNode reserve(ListNode prev,ListNode cur) { if(cur == null) { return prev; } ListNode temp = new ListNode(); temp = cur.next; cur.next = prev; return reserve(cur,temp); } }
这个的prev从null开始,一路成长到head的反向,在return;
思路特别一点,从原来的函数就可以写,是从尾部开始的递归
class Solution { public ListNode reverseList(ListNode head) { if(head==null||head.next==null) { return head; } ListNode last = reverseList(head.next); head.next.next = head; head.next = null; return last; } }
代码量最小,但是思路稍难一点
创造了五个平行宇宙,一个返回的是head = last
这时 last 为 5 ,返回上一层平行宇宙
head = 4,5. last = 5
head.next.next = head
这是最妙的一步,妙就妙在head.next这时候=last,这一步相当于把last指向head,我们的last就变成了5,4
在来到上一层宇宙,last = 5,4。 head = 3,4,5
通过head.next.next 把head再次加入到我们的last里面
如此往复,last最终变成5,4,3,2,1此时我们返回last,这就是被反转的链表。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。