老师您好,我在刷题时遇到了“翻转链表”这个问题,题目如下:
输入一个链表,反转链表后,输出新链表的表头。
比如 1->2->3->4->5 要变成 1<-2<-3<-4<-5
当然,这个问题很简单,用普通方法可以简单得到如下解:
(1)非递归思路
public class Solution {
public ListNode ReverseList(ListNode head) {
if(head == null) return null;
if(head.next == null) return head;
ListNode p = ReverseList(head.next);
ListNode q = p;
while (q.next != null){
q = q.next;
}
q.next = head;
return p;
}
}
但是听了你的课以后,我一直尝试用递归的思想去求解这个问题,(但是出现了问题,所以特地来这一章节向您提问)解法如下:
(2)递归思路求解
public class Solution {
public ListNode ReverseList(ListNode head) {
//递归到底的结果
if(head == null) return null;
if(head.next ==null) return head;
//假设ReverseList(head.next)已经将以head.next为头结点的链表翻转;
//同时返回翻转后链表的头节点reverse_head_next
//那么接下来的工作就是将head节点加入这个翻转后的链表里。
ListNode reverse_head_next = ReverseList(head.next);
//q用来遍历到链表的末尾,"接住"head;
ListNode q = reverse_head_next;
while (q.next != null){
q = q.next;
}
q.next = head;
return reverse_head_next;
}
}
当然这个解法是错的,bobo老师能否帮忙看看错在哪里?