//对链表的一个区间进行反转,时间o(n),空间o(1)。
#include<iostream>
using namespace std;
typedef struct tagNode
{
int val;
tagNode* vnext;
tagNode(int v) :val(v), vnext(NULL){}
}sNode;
// 对于1 23 4 5 6 15 12 78 45 65 32 21 22 33
//from为5,to为8进行反转,即15---45
//phead为6.pPre为15,pCur为12
void Resverse(sNode* pHead, int from, int to)
{
sNode* pCur = pHead->vnext;
int i;
for (i = 0; i < from - 1; i++){ //找到开始翻转节点from的前一个节点pCur
pHead = pCur;
pCur = pCur->vnext;
}
sNode* pPre = pCur;//from前的一个节点
pCur = pCur->vnext;//pCur是当前节点
to--;
sNode* pNext;
for (; i < to; i++){
pNext = pCur->vnext;
pCur->vnext = pHead->vnext;
pHead->vnext = pCur;
pPre->vnext = pNext;
pCur = pNext;
}
}
//对整个链表进行反转
//思路:通过新建链表然后依次取的前面的链表进行头插
class solution{
public:
sNode* ReverseList(sNode* head){
sNode* p = NULL;
sNode* temp = NULL;
while (head->vnext){
temp = head->vnext;
head->vnext = p;
p = head;
head = temp;
}
}
};