Check if a linked list is palindrome
2015-07-14 15:22
288 查看
关于链表是否为回文的算法思路:
1、如果链表的数字是个位数完全可以通过授权的方式来来解决,对于第1个节点*10的size()次方,依次权递减,同样,从尾到头也采取同样的方式授权,分别把两个方法得到的授权后的所有的数加起来,如果相等说明2者是回文,不是的话肯定不是回文。算法复杂度O(N)和空间复杂度O(1)
2、用栈来实现,把前半部分入栈,然后出栈依次和后半部分比较,如果全部相等则是回文,不是则不是。时间复杂度O(N),空间复杂度为:O(N/2)
3、递归的实现
定义递归函数为 Result rec(LinkedListNode head, int length) 意义为 传入链表头结点和链表长度,返回该链表的尾节点的下一个节点
Result是一个Wrapper 类,包含了node和当前是否match的判断
递归的关键是要清楚递归函数的每一个参数的意义是什么,还有返回值的意义是什么!!!
如下图:假设在递归的某一个阶段,要比较前半段的那个1和后半段的那个1是否相等:
根据递归可以得到蓝色部分的返回值Result,包含了一个res.node和match值。res.node的意义就是该子链表的尾节点的下一个节点,即后半段的1!
然后我们可以把head指向的1和res.node指向的1比较。如果相同则设置match为true,并且更新本层递归(红色区域)的返回值为本层子链表的尾节点(1)的下一个节点(0),作为res.node返回。
1、如果链表的数字是个位数完全可以通过授权的方式来来解决,对于第1个节点*10的size()次方,依次权递减,同样,从尾到头也采取同样的方式授权,分别把两个方法得到的授权后的所有的数加起来,如果相等说明2者是回文,不是的话肯定不是回文。算法复杂度O(N)和空间复杂度O(1)
2、用栈来实现,把前半部分入栈,然后出栈依次和后半部分比较,如果全部相等则是回文,不是则不是。时间复杂度O(N),空间复杂度为:O(N/2)
3、递归的实现
定义递归函数为 Result rec(LinkedListNode head, int length) 意义为 传入链表头结点和链表长度,返回该链表的尾节点的下一个节点
Result是一个Wrapper 类,包含了node和当前是否match的判断
递归的关键是要清楚递归函数的每一个参数的意义是什么,还有返回值的意义是什么!!!
如下图:假设在递归的某一个阶段,要比较前半段的那个1和后半段的那个1是否相等:
根据递归可以得到蓝色部分的返回值Result,包含了一个res.node和match值。res.node的意义就是该子链表的尾节点的下一个节点,即后半段的1!
然后我们可以把head指向的1和res.node指向的1比较。如果相同则设置match为true,并且更新本层递归(红色区域)的返回值为本层子链表的尾节点(1)的下一个节点(0),作为res.node返回。
相关文章推荐
- 知道程序员的女神都是谁吗?
- WebService系列博客{十}[CXF简单案例实现]
- OpenLayers开发:符号矢量化
- 谷歌技术"三宝"之BigTable
- nginx+Memcached 缓存设计
- Git生成SSHKey
- SCVMM 2012 R2运维管理十一之:添加Hyper-v群集
- 页面上画按钮的四种方法
- 【leetcode】Populating Next Right Pointers in Each Node II
- BestCoder Round #47 ($) (hdu 5280 , hdu 5281 , hdu 5282 , hdu 5283)
- 学会读懂 MySql 的慢查询日志
- Informatica
- Ubuntu-安装-Python包
- 操作系统期末总结文档和考试卷解析
- 可穿戴设备(CC2541)上微信(6)
- OpenLayers开发:WFS过滤
- WPF只有年和月份的DatePicker
- 使用windeployqt令.exe在别的电脑里都能正常运行
- 学会读懂 MySql 的慢查询日志
- 时钟