1.使用迭代法反转链表
迭代法遍历链表,采用双链表进行迭代,中间更新链表位置
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) : val(x), next(nullptr) {}
* };
*/
#include <codecvt>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @return ListNode类
*/
ListNode* ReverseList(ListNode* head) {
// write code here
ListNode* cur=head;
ListNode* pre=nullptr;
while (cur!=nullptr) {
ListNode* temp=cur->next;
cur->next=pre;
pre=cur;
cur=temp;
}
return pre;
}
};
2.递归法
使用递归函数,一直递归到链表的最后一个结点,该结点就是反转后的头结点,记作 ans。此后,每次函数在返回的过程中,让当前结点的下一个结点的 next 指针指向当前节点。同时让当前结点的 next 指针指向NULL ,从而实现从链表尾部开始的局部反转,当递归函数全部出栈后,链表反转完成。
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) : val(x), next(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @return ListNode类
*/
//递归法
ListNode* ReverseList(ListNode* head) {
// write code here
if(head==nullptr||head->next==nullptr)
return head;
ListNode* ans=ReverseList(head->next);
head->next->next=head;
head->next=nullptr;
return ans;
}
};