(欢迎指正)
1.递归。时间空间复杂度都是O(n)。
#include<iostream>
using namespace std;
//结构。
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* res = reverseList(head->next);
head->next->next = head;
head->next = NULL;//很重要
return res;
}
};
ListNode* creatList()
{
ListNode* prehead = new ListNode(-1);
ListNode* dummy = prehead;
cout << "输入链表,(通过“-1”终止输入):" << endl;
while (true)
{
int value;
cin >> value;
cout << " -> ";
if (value == -1)
break;
ListNode* donecreatList = new ListNode(value);
dummy->next = donecreatList;
dummy = dummy->next;
}
cout << endl;
return prehead->next;
}
void printList(ListNode* head)
{
if (!head)
{
return;
}
ListNode* forprintList;
forprintList = head;
while (forprintList)
{
cout << " " << forprintList->val;
forprintList = forprintList->next;
}
cout << endl;
}
int main()
{
solution solute;
ListNode* head = creatList();
cout << "给定链表:" << endl;
printList(head);
head = solute.reverseList(head);
cout << "返回:" << endl;
printList(head);
cout << head->val;
return 0;
}
2.迭代 时间复杂度O(n),空间复杂度O(1).
核心代码:
class Solution {
public:
ListNode* reverseList(ListNode* head)
{
if(!head||!head->next) return head;
ListNode*Cur=head;
ListNode*Pre=NULL;
while(Cur)
{ ListNode*fur=Cur->next;
Cur->next=Pre;
Pre=Cur;
Cur=fur;
}
return Pre;
}
};