1. 题⽬链接:206.反转链表
2. 题⽬描述:
3. 解法(递归):
算法思路:
1. 递归函数的含义:交给你⼀个链表的头指针,你帮我逆序之后,返回逆序后的头结点;
2. 函数体:先把当前结点之后的链表逆序,逆序完之后,把当前结点添加到逆序后的链表后⾯即可;
3. 递归出⼝:当前结点为空或者当前只有⼀个结点的时候,不⽤逆序,直接返回。
注意注意注意:链表的题⼀定要画图,搞清楚指针的操作!
C++算法代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution
{
public:
ListNode* reverseList(ListNode* head)
{
if(head==nullptr||head->next==nullptr)
{
return head;
}
//传递根节点
ListNode* newhead=reverseList(head->next);
//翻转后面的节点
head->next->next=head;
//将自己的下一位置为空
head->next=nullptr;
return newhead;
}
};
Java算法代码:
/**
* 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 newHead = reverseList(head.next);
head.next.next = head;
head.next = null;
return newHead;
}
}