以包含四个元素、带有头结点的链表l为例:
head->a1->a2->a3->a4;
保持头结点不变,头插法实现链表反转步骤为:
1: 将a2插在a1前面,该链表变为:
head->a2->a1->a3->a4;
2: 将a3插在a2前面,该链表变为:
head->a3->a2->a1->a4;
2: 将a4插在a3前面,该链表变为:
head->a4->a3->a2->a1;
可以发现,此时已经完成了链表的反转。
仔细观察,该方法可抽象为:
head->p->...->q->t->...->尾节点
即:每次将q节点插入首个节点p的前面。为了进行下次操作,我们还需要在插入前记录下q后面节点t。
当q为空时,该方法结束,此时完成了整个链表的反转。最后,记得将头结点head指向反转后的首个节点p,
同时将反转后的尾节点的next指针设为空。
C++实现:
/*
struct MyList{
int val;
struct MyList * next;
MyList(int n,MyList * Next):val(n),next(Next){}
};
*/
bool ReverseList2(MyList * l){
MyList * head = l;
l = l->next;
MyList * FirstOri = l;
if(!l)
return head;
MyList * p,*q,*t;
p = l;
q = p->next;
t = NULL;
while(q)
{
t = q->next;
q->next = p;
p = q;
q = t;
}
head->next = p;
FirstOri->next = NULL;
return true;
}
ps:除了上述方法外,尝试过先记录每个节点位置,然后更改每一个节点next的值,
使它指向原链表的前一个节点。实现后发现,需要循环的次数太多,但是方法比较直观。