实现链表逆序
来源:互联网 发布:excel数据加双引号 编辑:程序博客网 时间:2024/05/18 16:55
typedef struct List{
int data;
struct List *next;
}List;
这是我做练习题遇到的。编写一个函数实现对已有的一个链表逆序。自己刚开始也不懂,只知道就是要改变指针的指向,但是不知道什么实现,下面的代码也gogle的,然后自己弄明白的。
首先链表之间是结点,每个结点包含数据域和指针域,结点的指针域是指向下一个结点的数据域的,也就是说它保存的是下一个数据域的地址。而链表都会有一个头结点,头结点指向的就是第一个元素的地址。这就是一般顺序情况下链表指针的指向关系。
要实现链表逆序,就是让指针的指向改变,即next指针不再指向下一个元素,而是指向上一个元素,第一个元素指向空,然后再用一个类型的指针指向最后的元素,当做头结点。
结合代码:
List *list_reverse(List *head)
{
//思路就是改变每个节点的next指针的指向,本来每个节点的next指针指向的是下一个元素的地址,现在让它指向上一个元素的地址
List *p,*q,*r,*head1;
p=head;//p指向head头节点,头节点的next指针指向的是第一个元素的位置
q=p->next;//即头节点的next指针,指向第一个元素的地址
while(q!=NULL)
{
r=q->next;//保存q的下一个元素的地址,以便后面让q指向它的下一个元素
q->next=p;//改变q->next的指向,让它指向上一个元素,
p=q;//让p指向q现在的位置
q=r;//让q指向q的下一个位置,r存的就行q的下一个元素的地址
//每一次循环结束,都能让q->next指向它的上一个元素,而p和q又移动到各自的下一个节点,进行同样的操作,直到最后q-next指向了null,而r = q->next也就空了,q = r;q也就为空了,p也移到了最后一位,循环结束,成功改变所以q->next指针,让他们指向它们的上一个元素。
}
// head1 = p;
head->next =NULL;//head->next本来指向的是第一个元素,现在它作为最后一个元素,要让它指向null,否则会一直指向第一个元素
head1 = p;//让头节点指向p,即最后一个元素的地址。
//如果是head = p;那么这个head不是实参传来的head,是重新创建一个头节点。而且用这个同名的head之后
// 如果是写成head = p;和head->next顺序不能颠倒,不然就是把新创建的head->next指向null,不指向后面就没法输出了。
return head1;
}
具体的解释代码后面的解释都有,自己刚开始的时候也弄不明白,以前数据结构学得不好,所以第一次看的时候就是看不懂,调试打断点什么的也还是看不明白,整个人就处于烦躁之中,觉得怎么这么难理解,晚上回去睡了一觉,第二天早上起来又开始分析,终于弄明白了(不知道是不是早上效率比较高还是人的状态比较好的原因)。现在感觉特容易,那种解决了难题之后的喜悦还是挺好的(也许这就是这行的魅力所在吧),虽然代码不是自己写的,但是理解没有注释的代码对于还在学语法的自己来说还是有点难。也许以后也会有菜鸟会遇到和我一样的情况,所以就把解释写的多点,希望能帮助以后的初学者。
- 实现链表逆序
- 实现链表逆序
- 实现链表逆序
- 链表的逆序实现
- Java实现链表逆序
- C++实现链表逆序
- 编码实现链表逆序
- 指针实现链表逆序
- 【数据结构】递归实现链表逆序
- 递归法实现链表逆序
- 链表逆序的实现方法
- 如何实现将一个链表逆序?
- 实现链表逆序(头插)
- 实现链表逆序(头插)
- 链表逆序最少空间实现
- 【数据结构练习】单向链表实现、链表逆序实现
- 链表逆序的循环实现和递归实现
- JAVA链表实现与链表的逆序
- Jsp/Servlet基础-一
- javascript中的var i = {};是什么意思
- 暑假完了之后的总结
- 十进制数转八进制数
- 在本机用Toad远程连接Oracle数据库
- 实现链表逆序
- Android后台运行的定时器实现
- java比较器Comparable和Comparator的使用
- Oracle优化之sql基本功
- 常用正则表达式
- 使用matlab进行mex编译时的路径问题mexopts
- Java的HashMap和HashTable
- 利用clang和gcc进行宏的研究
- Linux兼容内核(Linux Unified Kernel,亦称 Longene)