给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]
输入:head = [1,2] 输出:[2,1]
输入:head = [] 输出:[]
我在网上找到了动画链接,方便理解:
https://code-thinking.cdn.bcebos.com/gifs/206.%E7%BF%BB%E8%BD%AC%E9%93%BE%E8%A1%A8.gif
方法一:双指针
/**
* 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) {
//如果为空指针,就可直接返回NULL
if(head==nullptr){
return NULL;
}
ListNode* pre=NULL;
ListNOde* cur=head;
while(cur!=NULL){
//记录当前节点的下一个元素的地址,因为cur接下来指向的地址会改变
ListNode* temp=cur->next;
cur->next=pre;
pre=cur;
cur=temp;
}
}
};
方法2:递归遍历 递归的方式有些不好理解,但是只要把上面循环弄清楚了的话,也没有那么难
/**
* 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* pre=NULL;
ListNode* cur=head;
return reverse(pre,cur);
}
ListNode* reverse(ListNode* pre,ListNode* cur){
if(cur==NULL){
return pre;
}
ListNode* result=reverse(cur,cur->next);
cur->next=pre;
return result;
}
};