typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
/*方法一是采用三个工作指针的方式,就地逆置单链表结点*/
void Reverse1(LinkList L){
LNode *q,*p,*r;
p=L->next;r=p->next;//p为第一个结点,r为第二个结点
L->next=NULL;p->next=NULL;//头结点断链,第一个结点断链
while(r){
q=p;
p=r;
r=r->next;
p->next=q;
}
L->next=p;
}
假设链表为 L->a->b->c->d->NULL;
1.L->NULL,a->NULL 链表:b->c->d->NULL; *p=a,
2.L->NULL,b->a->NULL 链表:c->d->NULL; *q=a,*p=b,*r=c p->next=q;
3.L->NULL,c->b->a->NULL 链表:d->NULL; *q=b,*p=c,*r=d p->next=q;
4.L->NULL,d->c->b->a->NULL 链表:空; *q=c,*p=d,*r=NULL p->next=q;
5.L->d->c->b->a->NULL
/*方法一应该是必掌握的基础了,很多就地逆置的方法都会用到.
当然还有方法二,也就是采用头插法的方式*/
void Reverse2(LinkList L){
LNode *p=L->next,*q;
L->next=NULL;
while(p){
q=p->next;
p->next=L->next;
L->next=p;
p=q;
}
}
链表的就地逆置时间复杂度为O(n),空间复杂度O(1)。