反转链表
第一种方法:迭代/双指针
- 定义两个指针:pre,cur。其中pre在前,cur在后;
- 实现局部反转:pre的next指向cur;
- 位置移动:pre,cur均先前移动一个位置;
- 循环遍历:直至pre到达链表尾部。
程序:
class Solution{
public:
ListNode* reserve(ListNode* head){
ListNode* pre=head;
ListNode* cur=nullptr;
while(pre!=nullptr){
ListNode* temp=pre->next;
pre->next=cur;
cur=pre;
pre=temp;
}
return cur;
}
};
第二种方法:递归
- 循环函数,递归至最后一个节点
- head->next->next=head; 实现局部反转,即当前结点的下一个结点的 next 指针指向当前节点;
- head->next=nullptr; 当前结点的next 指针指向nullptr;
ListNode* reverseList(ListNode* head){
if(head==nullptr || head->next==nullptr){
return head;
}
ListNode* ret=reverseList(head->next);
head->next->next=head;
head->next=nullptr;
return ret;
}