Algorithm
描述: 给定一个单链表 L:L0→L1→…→Ln-1→Ln , 将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
思路:
- 用快慢法找到中点,并从中点断开为左右两个链表
- 反转右链表
- 逐个合并左右链表
Review
Avoid cascading if-else in Kotlin
if 应只用于2个选项的判断,3个及以上的选项的判断应该由 when 来处理。
串联的 if

上方为 if 语句的 kotlin 代码,反编译为 Java 后如下图:

用 when 代替
when 代替后如图所示:

如果判断条件是2个,会转成 if-else ,如果2个以上且 case 是常量或二进制表达式时,则会转成 switch 。
因为 switch 是常量,根据1个预选创建好的“跳转表”跳转,所以在条件多的时候,比 if 逐次对比运行得要更快。
if else 工作原理
if-else 在Kotlin中是一个表达式,也是一个状态,它返回一个值,也可以作为语句使用。而在Java中 if-else 只是一个状态。

if-else 的语法如下:

让我们配合1个谜题来理解这个。

这个方法在调用时不会 print 任何内容。因为 if-else 是单独的表达式,而 let 是被最后的表达式所调用。上面的代码也可以等价的视为:

Tip
android ktx 中动画的 doOnCancel , doOnEnd , doOnPause , doOnRepeat , doOnResume , doOnStart 都提供了单独的设置方法,如果只关心动画的某个状态,只需要设置对应的监听即可。
Share
暂无