链表 逆序我的实现
首先描述一下链表逆序实现的想法
我们来看看一个节点里有什么
内存中地址为aaaa的区域 left 内存中地址为 aaba的区域 right
data 存放的数据 data 存放的数据
addr 下一个的地址 aaba addr 下一个地址xxxx
我们将它逆序要怎么做,实际上就是将 addr 里面的内容改为 上一个节点的地址
大家都知道,两个数之间交换不能直接相互赋值,而是需要引入一个中间量,保存初始数据不至于丢失。
同样链表也是一样,要改变addr里面的值,就必须先将里面的值保存起来
那么我们的实现就是 NODE *left, *right, *head;
right = left->next; //保存下个节点
left->next = head; //更改指向的地址,向前指
这样我们就实现了链的断开,而且不丢失下一条链。
此时,在left节点内存放了head的地址,即head被指向了。
所以我们可以进行下面的操作
head = left; //把left所以的值都传给head(其实传递的地址值)
//在这里我们不必担心会丢失head的数据
//想一想为什么
既然left里面的值被head 保存下来了,那left就解放了,可以存放别的值而不必担心丢失
left = right;
以上两个语句的意思是将head 和 left 向右移动一个节点
至此,这个循环就可以开始工作了。
while(结束条件)
{
right =left->next; //移动节点
left->next = head; //改变指向
head = left; //移动节点
left = right; //移动节点
}
从上面的代码就可以看出 用了三个容器在链表上穿梭
实际代码
NODE *reverse_list(NODE *head)
{
NODE *left = NULL,*right;
left = head->next;
head->next = NULL;
right =left; //循环开始的准备
while(next !=NULL)
{
right=right->next;
left->next = head;
head =left;
left= right;
}
return head;
}