一道比较经典的算法题目:有一单链表将其逆转。刚开始的时候想的磕磕绊绊,静下心来2分钟码定。汗。
##分析
每次调整对一个节点,并将其记住。继续处理下一个,可以进入相同的状态,区别仅在于第一个时,前一个“记录”是NULL。
typedef struct list_ {
int a;
struct list_ *next;
}list;
list *reverse_list(list *head)
{
list *r = NULL,*p = head,*q;
while(p) {
q = p->next;
p->next = r;
r = p;//remember the current one
p =q; // to the next
}
return r;
}
int main(void)
{
int i = 10;
list *q = NULL,*p;
while(--i) {
p = (list*)malloc(sizeof(list));
p->a = i;
p->next = q;
q =p;
}
p = q;
while(q) {
printf("%d ", q->a);
q=q->next;
}
q = reverse_list(p);
p = q;
while(q) {
printf("%d ", q->a);q = q->next;
}
while (p) {
q = p->next;
free(p);
p = q;
}
return 0;
}
1 2 3 4 5 6 7 8 9 9 8 7 6 5 4 3 2 1