使用kotlin解决这个问题:234. 回文链表 简单 1.7K 相关企业 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 示例 1: 输入:head = [1,2,2,1] 输出:true 示例 2: 输入:head = [1,2] 输出:false 提示: 链表中节点数目在范围[1, 105] 内 0 <= Node.val <= 9 进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
时间: 2024-01-20 07:02:45 浏览: 106
inject:围绕javax.inject批注的简单Kotlin多平台抽象
好的,我来为您提供一个使用 Kotlin 解决该问题的代码实现:
```kotlin
class ListNode(var `val`: Int) {
var next: ListNode? = null
}
fun isPalindrome(head: ListNode?): Boolean {
if (head == null) {
return true
}
// 快慢指针找到链表中点
var slow = head
var fast = head
while (fast?.next != null) {
slow = slow?.next
fast = fast.next?.next
}
// 翻转后半部分链表
var prev: ListNode? = null
var curr = slow
while (curr != null) {
val next = curr.next
curr.next = prev
prev = curr
curr = next
}
// 比较前半部分和后半部分链表
var p1 = head
var p2 = prev
while (p2 != null) {
if (p1?.`val` != p2.`val`) {
return false
}
p1 = p1.next
p2 = p2.next
}
return true
}
```
该算法的思路是:使用快慢指针找到链表的中点,然后翻转后半部分链表,最后比较前半部分和后半部分链表是否相等,如果相等则说明该链表是回文链表。时间复杂度为 O(n),空间复杂度为 O(1)。
阅读全文