ARTS-19

161 阅读2分钟

Algorithm


143. 重排链表

描述: 给定一个单链表 L:L0→L1→…→Ln-1→Ln , 将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

思路:

  1. 用快慢法找到中点,并从中点断开为左右两个链表
  2. 反转右链表
  3. 逐个合并左右链表

Review


Avoid cascading if-else in Kotlin

if 应只用于2个选项的判断,3个及以上的选项的判断应该由 when 来处理。

串联的 if

Image for post

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

Image for post

用 when 代替

when 代替后如图所示:

Image for post

如果判断条件是2个,会转成 if-else ,如果2个以上且 case 是常量或二进制表达式时,则会转成 switch

因为 switch 是常量,根据1个预选创建好的“跳转表”跳转,所以在条件多的时候,比 if 逐次对比运行得要更快。

if else 工作原理

if-else 在Kotlin中是一个表达式,也是一个状态,它返回一个值,也可以作为语句使用。而在Java中 if-else 只是一个状态。

Traditional Java if-else vs Kotlin if-else

if-else 的语法如下:

Grammar for if in Kotlin

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

if else scope — The expression is unused

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

Image for post

Tip


android ktx 中动画的 doOnCanceldoOnEnddoOnPausedoOnRepeatdoOnResumedoOnStart 都提供了单独的设置方法,如果只关心动画的某个状态,只需要设置对应的监听即可。

Share


暂无