数据结构笔记--反转链表分析
2016-07-25 13:31
295 查看
最近在复习数据结构的时候,看到一道反转链表的题。题目要求将给定链表改变指针指向,从而达到链表逆转的目的。尝试着做了几次,发现改的链表不是健壮性不够,就是在反转的时候会断掉。最终改了好几次,终于大功告成。
参数分析:函数传入一个指向原来链表头的指针,可以修改让其直接修改指针指向,也可以返回指向新链表的头指针,不管怎么都是要求改变原链表的结构。
参数合法性分析:当链表为空的时候,直接让函数终止。当链表只有一个节点时,发现修改指向与不修改都是一样的,终止函数。
函数思路:修改指针指向,就是让后一个节点的next指向前一个节点,所以我们需要两个指针,一个指针指向当前节点,另一个指针指向前一个节点,然后改变指向。然而改变指针指向之后,当前节点就无法在继续向后移动,所以在修改指向之前,保存当前节点的下一个节点。直到当前节点为空为止。既成功改变指针指向。
结构体定义:
逆转函数:
注:此版本为翻转不带头结点的链表,如果要翻转带头节点的链表,原理都是一样的,只是在开始定义指针时,让他指向头结点的next。翻转完成之后,再让头结点指向已翻转链表的新头结点即可。
参数分析:函数传入一个指向原来链表头的指针,可以修改让其直接修改指针指向,也可以返回指向新链表的头指针,不管怎么都是要求改变原链表的结构。
参数合法性分析:当链表为空的时候,直接让函数终止。当链表只有一个节点时,发现修改指向与不修改都是一样的,终止函数。
函数思路:修改指针指向,就是让后一个节点的next指向前一个节点,所以我们需要两个指针,一个指针指向当前节点,另一个指针指向前一个节点,然后改变指向。然而改变指针指向之后,当前节点就无法在继续向后移动,所以在修改指向之前,保存当前节点的下一个节点。直到当前节点为空为止。既成功改变指针指向。
结构体定义:
typedef char Datatype; typedef struct node { Datatype m_data; struct node* m_next; }List;
逆转函数:
List* Reverse(List* head) { if (NULL == head || NULL == head->m_next)//如果头为空或者只有一个节点 return head; List *pre = head, *cul = head->m_next; pre->m_next = NULL; List *newHead = NULL; while (cul) //当前节点不为空 { List* next = cul->m_next; if (NULL == next) { newHead = cul; } cul->m_next = pre; pre = cul; cul = next; } return newHead; }
注:此版本为翻转不带头结点的链表,如果要翻转带头节点的链表,原理都是一样的,只是在开始定义指针时,让他指向头结点的next。翻转完成之后,再让头结点指向已翻转链表的新头结点即可。
相关文章推荐
- SDUT2134数据结构实验之栈四:括号匹配
- SDUT2131数据结构实验之栈一:进制转换
- 两个队列实现一个栈
- [算法学习笔记]数据结构之栈和队列
- [从头学数学] 第248节 Python实现数据结构:队列
- 数据结构实验之二叉树四:还原二叉树
- 数据结构和算法C++语言实现:双向链表
- 数据结构:广义表
- 数据结构(堆):SCOI 2009 生日礼物
- [从头学数学] 第247节 Python实现数据结构:栈
- 数据结构——树的术语
- 【Codeforces Round 364 (Div 2)C】【前缀和 双指针】They Are Everywhere 含有所有字符的最短区间长度
- 数据结构实验之二叉树三:统计叶子数
- 【栈】华为OJ:火车进站
- [从头学数学] 第246节 Python实现数据结构:链表
- 【HDU5751 BestCoder Round 84E】【FFT + 线段树求最值】Eades 最大数出现次数为[1~n]的区间个数
- C语言学习之 内存管理及数据结构操作
- 数据结构
- 对数据结构的一些了解
- 读书笔记-《大话数据结构》第一章数据结构绪论