//倒序链表1
node *reserved_list(node *head)
{
node *z_head=NULL,*z_read=NULL;
//我要把第一个变成最后一个 那么第一个的next指针域就要是NULL
//但是我每次都要改变head的指向,最终返回的是head
//所以我就把head用一个东西来代替
z_head=head;
head=NULL;
//z_read是用来给z_head赋值的 使z_head可以遍历整个链表 也就是当p为NULL的时候整个链表才结束
while(z_head!=NULL)
{
z_read=z_head->next; //这里把z_read指向z_head的下一个节点
z_head->next=head; //实现第一个节点的next域为NULL 之后每个节点的next域都指向上一个head节点
head=z_head;//这样写head每次就代替了这个节点 每次都这样就实现了head最终指向最后一个节点
z_head=z_read;//最终我是要把这两个值互换的
}
return head;
}
//倒序链表2
node *reserved_list2(node *head)
{
if(head==NULL)
{
return NULL;
}
node *z_read=NULL, *zh_read=NULL;
//用来依次遍历链表的递减指针用来赋值给z_read的指针
node *tail=NULL, *z_tail=NULL;
//为最终的返回指针 用来(指向tail节点的下一个节点)的指针
//因为最后返回指针不是head指针 所以head不用移动 而作为一个结束的标志
while(head!=z_tail)//最终是要让tail为开头的链表的最后一个节点为head
{
z_read=zh_read=head;
//把这个指针继承head链条 之所以放在循环里面是因为zh_read 和 z_read 两个同时都在改变位置
//而每次都要让zh_read 和 z_read 往前移动一个位置 那么每次就都要重新遍历zh_read 和 z_read
//同时还要设立一个新的条件 就是让z_read不等于z_tail
while(z_read->next!=NULL)
{
zh_read=z_read;//经过这个循环每次的z_read指向的都是z_tail的前一个节点
z_read=z_read->next;
//而每次zh_read指向的是z_read的前一个节点
//这样一直循环 最后会让z_read为head
}
zh_read->next=NULL; //这样每次就把z_head所指向的节点分离出来,就不和head相连了
//前一种是因为head每次都在移动 最后head就指向了最后一个节点
//而这里的head没有移动 但是我想让他的内存地址改变 那么我就要把每次的数据分离
if(tail==NULL)
{
tail=z_tail=z_read; //既然tail作为链条的头部那么他就要有值
}
else
{
z_tail->next=z_read; //结束条件是 head!=z_tail z_read每次在移动 那么z_tail也要移动
z_tail=z_read; //这样z_tail到最后指向的就是head节点了
}
}
return tail;
}