前言
不小心看到了LeetCode上边题目的答案: 234 .回文链表,难度很简单。 说实话,看了最先解题的代码,我懵了,看了三遍才明白…不禁感叹:有点意思~
正文
。
实现代码
贴一下网上的回答(完成高级内容的代码)吧。//*
* *定义资讯连结清单。
* *公共类列表节点{
* *国际航空;
* *监听器下一步;
* *列表节点(intx ) {val=x; }
*}
*/
类解决方案{2}
公共管道头(监听器头) {
if (头==空| |头.下一个==空) {
返回真;
}
清单预览=空值;
listnode slow=头;
列表节点快速=头;
wile (快速!=空的快速.下一个!=空值) {
fast=fast.next.next;
列表节点下一个=慢速.下一个;
slow.next=预览;
prev=慢速;
慢=下一步;
}
if (第一!=空值) {
慢=慢.下一个;
}
wile (慢!=空值) {
IF (慢. Val!=prev.val ) {
返回假;
}
慢=慢.下一个;
prev=prev.next;
}
返回真;
}
}
解题思路
我首先想到的是,把两个栈,还有链表从头各按一半进入栈,剩下的按相反的顺序按另一个栈。 然后同时把栈放出来判断是否都一样,如果是,就是回文。 (多考虑奇书的情况即可,奇书的数量直接扔掉处理即可) )。但是,很明显空间复杂性不是o(1)。 所以,我想怎样通过链表来判断是否是回文呢? 不得不说,我在此时的思考过程中陷入了僵化,思考了如何利用链表来判断回文…但是,其实我已经利用栈实现了这个能力。 只是换成了链表的实现。
首先请不要在这里停下来继续阅读。 带着我们实现的想法读代码吧。 如果get到了原作者的安装,请不要继续阅读,将其删除。
解析一下这个part,原作者的想法吧。 其实是三个部分。
1 .找到链表的中间节点2 .基于中间节点进行切断。 第一节通过依次对比反转整个链表的3.2个链表,沿着这3个步骤,逐条看看作者的实现原理。
1 .如何找到中间的节点?
对应于fast和slow两个变量的快速指针按顺序遍历链表。 快针一到头上,慢针正好通过中间。 这里怎么处理奇数的情况? 就是这个判断
if (第一!=空值) {
慢=慢.下一个;
}
2 .链表的反转
这个应该不用介绍太多。 就是这个代码。
wile (快速!=空的快速.下一个!=空值) {
fast=fast.next.next;
列表节点下一个=慢速.下一个;
slow.next=预览;
prev=慢速;
慢=下一步;
}
这段代码结束后,名为prev的链表头是前一半链表的反转链,slow是后一半链表。
3 .按顺序比较两个链表
wile (慢!=空值) {
IF (慢. Val!=prev.val ) {
返回假;
}
慢=慢.下一个;
prev=prev.next;
}
返回真;
这个比较的代码完全没有必要说明吧。