首先思路必须要清晰,正常思维是倒着来,先找到尾巴结点,这样我们发现都需要记录前驱结点,这样是很繁琐的,因为无法知道前驱结点。
所以只能从头往后逆置,而且逆置是一个结点一个结点这样找的,所以我们需要记录当前结点的下一个节点,另外当发生逆置时,是需要知道前面的结点的,因此还需要另外一个结点记录前驱结点。
typedef struct SList{
int val;
SList *next;
SList(int x) : val(x), next(NULL) {}
}SList;
int SList_Reverse(SList *pHead){
SList *p = NULL;
SList *q = NULL;
SList *t = NULL;
if (pHead == NULL||pHead->next==NULL||pHead->next->next==NULL){
return 0;//不需要逆置
}
p = pHead;//current前驱结点
q = p->next;//current结点
while (q){
t = q->next;//记录currnt下一个结点
q->next = p;
p = q;
q = t;
}
//头结点变成尾部结点后置NULL
pHead->next->next = NULL;
pHead->next = p;
return 0;
}