给你一个链表的首结点(不是头结点),要求你翻转这个链表,你会怎么做?
很多人的第一反应是先创建一个头结点dummy,然后遍历链表,用头插法插入dummy的后面,最后返回dummy->next。也就是我们说的迭代法。
迭代的是人,递归的是神!所以我们用递归法试一下。
假设一个链表为1->2->3->4->5。我要你翻转这个链表,而在你开始翻转之前,有个打工人已经将链表改成了这个样子:1->2<-3<-4<-5,那你会怎么做将链表改成5->4->5->2->1 ?答案显而易见,将1->2改成1<-2,然后返回5这个节点的首地址就行。
将上面五个节点的情况延续到很多个节点的情况时,就可以按照以下步骤来进行翻转。
1、如果链表是空链表或只有一个节点,那么什么也不要做,return head。
2、如果链表存在一个以上的节点,则执行一下步骤
(1)、叫一个打工人将head节点后面的节点视作一个链表,回到步骤1进行翻转,也就是reverse(head->next);并返回翻转那部分的首节点newhead。
(2)、随后你将head指向head->next改成head->next指向head。即head->next->next=head;head->next=NULL;
(3)、将newhead视作首节点,完成翻转。即return newhead;
实现代码:
c++
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (!head || !head->next) {
return head;
}
ListNode* newHead = reverseList(head->next);
head->next->next = head;
head->next = nullptr;
return newHead;
}
};
java
class Solution {
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode newHead = reverseList(head.next);
head.next.next = head;
head.next = null;
return newHead;
}
}