给定一个单链表,求其逆序。
主要有两种方法:
方法一:
使用三个指针,从表头到表尾,每两个节点进行翻转。
struct node
{
int val;
struct node *next;
};
struct node * revergeList1(struct node *l)
{
assert(l!=NULL);
struct node *p=NULL;
struct node *q=l;
struct node *r=l->next;
while(r!=NULL)
{
q->next=p;
p=q;
q=r;
r=r->next;
}
q->next=p;
return q;
}
方法二:
把从链表第二个节点到最后的结点依次插入到表头的后面。
struct node * revergeList2(struct node *l)
{
assert(l!=NULL);
if(l->next==NULL)
{
return l;
}
struct node *p=l->next;
struct node *q;
while(p->next!=NULL)
{
q=p->next;
p->next=q->next;
q->next=l->next;
l->next=q;
}
struct node *head=l->next;
l->next=NULL;
p->next=l;
return head;
}
这里要注意只有一个结点的情况。