一、题目:
二、解题思路:
方法一:循环
利用prev将链表指针指依次向其前驱。
方法二:递归
最后的节点作为开头节点往前倒推:
方法三:栈或者数组
设置额外的空间,例如栈,利用其先进后出的特性完成翻转;或者将链表元素依次放入数组中逆序输出。
三、代码和结果:
//方法一:循环迭代
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* curr = head;//初始化定义curr
ListNode* prev = nullptr;//定义prev,初始化为空
while(curr){
ListNode* next =curr->next;
// ↑用于暂存next指向下一个节点,没有这句会导致执行一次以后链表断掉
curr->next = prev;
prev = curr;
curr = next;
}
return prev;
}
};
//方法二:
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(!head || !head->next)return head;//头或者头结点的下一个节点为空
ListNode* newH = reverseList(head->next);//递归
head->next->next = head;//指向自己
head->next = nullptr;//此时的head是尾结点
return newH;
}
};
方法一结果:
方法二结果: