1、迭代,将指向反转
使用新建的next指针,先将当前元素的后面的元素存储下来
改变当前元素的指向,然后更新当前元素和前一个元素的值
循环的条件是当前元素是否为空,因此循环结束时,curr应该是空的,因此返回应该是返回pre,也就是当前元素的前一个
/*** 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)return nullptr;ListNode* pre=nullptr;ListNode* curr=head;ListNode* next=nullptr;while(curr){next=curr->next;curr->next=pre;pre=curr;curr=next;}return pre;}
};2、递归
若链表为空或仅有一个节点,则直接返回头节点(无需反转)
递归地反转以头节点下一个节点开始的子链表,该递归调用返回反转后子链表的新头节点
在递归返回后,将当前头节点的下一个节点的`next`指针指向当前头节点,实现局部反转
然后将当前头节点的next置为空,断开与原链表的连接,避免成环
最后,递归过程始终返回子链表反转后的新头节点
/*** 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||!head->next)return head;ListNode* newHead=reverseList(head->next);head->next->next=head;head->next=nullptr;return newHead;}
};