首页 > 编程知识 正文

leetcode 983(leetcode300)

时间:2023-05-05 22:56:57 阅读:80509 作者:1203

前言

不小心看到了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;

}

返回真;

这个比较的代码完全没有必要说明吧。

尾声

偶尔看算法很有趣。 和你学习~

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。