题目:206. 反转链表
方法一:迭代,在遍历到每一个位置q时,将q->next指向前一个位置p即可。
/**
* 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) {
ListNode * p,*q;
p=nullptr,q=head;
while(q){
ListNode * tmp=q->next;
q->next=p;
p=q;
q=tmp;
}
return p;
}
};
方法二:递归,从最右边开始修改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) {
//当链表为空,或者递归到的元素是最后一个时,直接返回head,这个head就是最终要返回的
if(head==nullptr||head->next==nullptr) return head;
//递归到下一个元素
ListNode * tmp=reverseList(head->next);
//开始从后往前修改next的指向
head->next->next=head;
head->next=nullptr;
return tmp;
}
};