题目描述
输入一个链表,反转链表后,输出新链表的表头。
可能一开始会想到体用栈等数据结构来辅助存储,实际上是没必要的,最简单的想法是改变每个元素的next的方向:
递归版本:
#include <iostream>
#include <string>
#include <memory>
#include <vector>
#include<cmath>
#include<algorithm>
#include<stack>
using namespace std;
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
if(pHead==NULL) {
return NULL;
}
ListNode* head_next=pHead->next;
if(head_next==NULL) {
return pHead;
}
ListNode* Reverse_head=ReverseList(pHead->next);
pHead->next=NULL;
head_next->next=pHead;
return Reverse_head;
}
};
int main()
{
Solution sol;
ListNode *test=new ListNode(2);
test->next=new ListNode(1);
ListNode * resverse=sol.ReverseList(test);
cout<<resverse->val<<endl;
system("pause");
return 0;
}
非递归版本:
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
if(pHead==NULL) {
return NULL;
}
ListNode* p_next=pHead->next;
if(p_next==NULL) {
return pHead;
}
ListNode* p=pHead;
ListNode* r=p_next->next;
p->next=NULL;
while(p_next!=NULL) {
p_next->next=p;
p=p_next;
p_next=r;
if(r!=NULL)
r=r->next;
}
return p;
}
};