https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof/
思路一:正着做,假设当前节点为 c u r cur cur,前一节点为 p r e pre pre,那么只需要把 c u r cur cur接到 p r e pre pre前面即可,当然需要一个临时变量预先存储下一节点 n x t nxt nxt。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(!head||!head->next)
return head;
ListNode *pre=nullptr;
ListNode *tmp;
while(head){
tmp=head->next;
head->next=pre;
pre=head;
head=tmp;
}
return pre;
}
};
思路二:递归。把后继的后继改为自己即可做到反转。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(!head||!head->next)
return head;
ListNode *tmp=reverseList(head->next);//返回的一直都是最后一个节点
head->next->next=head; //修改下一节点的后继位自身
head->next=nullptr;//其实只是为了把尾节点的后继置为空
return tmp;
}
};