Palindrome Linked List
2015-08-06 11:27
134 查看
题目链接
思路:
元素一次进栈,然后再依次出栈就是一次反转。
第一次遍历把链表里面的数值都放到一个栈里面。
然后再遍历一次链表,其中每遍历一个元素对比栈顶的元素,如果相等继续算法,不等返回假。
题目的意思是有线性时间和常量空间的算法,我没有想到。看看之后能有什么解决方法。再来补充。
补充1
看了两种方法用常量空间解决的方法。方法一我有点没看懂,但是大约的意思是用xor。然后用类似加密解密的方式来做,不同顺序解密结果不一样。方法二是找到尾节点,和中间节点(找的方法是前面指针向前两个,后面指针向前一个,这样前指针是尾,后指针是中间)然后对后面的一般进行链表逆转之后再从头和中间开始遍历。。。
思路:
元素一次进栈,然后再依次出栈就是一次反转。
第一次遍历把链表里面的数值都放到一个栈里面。
然后再遍历一次链表,其中每遍历一个元素对比栈顶的元素,如果相等继续算法,不等返回假。
题目的意思是有线性时间和常量空间的算法,我没有想到。看看之后能有什么解决方法。再来补充。
补充1
看了两种方法用常量空间解决的方法。方法一我有点没看懂,但是大约的意思是用xor。然后用类似加密解密的方式来做,不同顺序解密结果不一样。方法二是找到尾节点,和中间节点(找的方法是前面指针向前两个,后面指针向前一个,这样前指针是尾,后指针是中间)然后对后面的一般进行链表逆转之后再从头和中间开始遍历。。。
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ public class Solution { public boolean isPalindrome(ListNode head) { Stack<Integer> myStack=new Stack<Integer>(); ListNode pointer=head; while(pointer!=null) { myStack.push(pointer.val); pointer=pointer.next; } pointer=head; while(pointer!=null) { if(pointer.val!=myStack.pop()) { return false; } else { pointer=pointer.next; } } return true; } }
相关文章推荐
- C++栈和队列
- Linux 进程间 互斥锁
- 27. Element nodeType 属性
- [Effective C++] 01. View C++ as a federation of languages.
- 一张图道尽程序员的出路
- TCP协议疑难杂症全景解析
- 常用linux命令
- jquery实现点击查看更多内容控制段落文字展开折叠效果
- Windows10 如何会成为微软的新起点?
- 关于ObjectOutputStream和ObjectInputStream类的文件的输入输出流操作的心得
- 通过模仿微博编辑框字数显示——编辑框监听介绍
- Windows10 如何会成为微软的新起点?
- Spring DataBinding
- Apache通用日志工具commons-logging和Log4j使用总结
- jquery combobox下拉及异步加载数据
- Logistics-->SVM
- 用g++编译生成动态连接库*.so的方法及连接(dlopen() dlsym() dlclose())
- AppModify修改app.config
- c++ 结构体 构造函数
- 教大家如何给UITextView添加placeholder扩展