迭代
先记录下一个节点的指针,然后把前一个节点放到当前节点的后面,更新当前节点为前一个节点,更新下一个节点为当前节点,最后返回最后一个节点指针
class Solution {
public:
ListNode *reverseList(ListNode *head) {
ListNode*prev= nullptr;
ListNode*curr=head;
while(curr){
ListNode*next=curr->next; // 先记录下一个的位置
curr->next=prev; // 把前一个节点放到当前节点的后面
prev=curr; // 更新当前节点为前一个节点
curr=next; //更新下一个节点为当前节点
}
return prev; // 返回最后一个节点指针
}
};
递归
递归版本无敌,考虑当前节点,翻转只需要翻转后面段的节点,以及把后一个的节点移到当前节点的前面
class Solution {
public:
ListNode *reverseList(ListNode *head) {
if (!head || !head->next) // 空链表或到了链表尾节点
return head;
ListNode *next = head->next; // 取后面段节点
ListNode *prev = reverseList(next); // 翻转后面段
next->next = head; // 将后一个节点移到当前节点前面
head->next = nullptr; // 将当前节点后面设置为空
return prev; // 返回最后一个节点指针
}
};