mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-09 03:34:02 +08:00
feat: 新增0234ts代码块
This commit is contained in:
@ -319,6 +319,74 @@ var isPalindrome = function(head) {
|
||||
};
|
||||
```
|
||||
|
||||
```typescript
|
||||
function isPalindrome(head: ListNode | null): boolean {
|
||||
// 方法1:利用栈结构 将所有元素添加到栈中
|
||||
// 声明栈
|
||||
let stack:number[] = []
|
||||
|
||||
// 保存一份头结点 后续需要移动头结点
|
||||
let dummy:ListNode = head
|
||||
|
||||
// 遍历链表将所有元素添加到数栈中
|
||||
while(dummy){
|
||||
stack.push(dummy.val)
|
||||
dummy = dummy.next
|
||||
}
|
||||
|
||||
// 利用栈结构的先进先出后出的特性判断是否会文
|
||||
while(head){
|
||||
if(head.val!== stack.pop()) return false
|
||||
head = head.next
|
||||
}
|
||||
|
||||
return true
|
||||
|
||||
// 方法2:翻转后半部分链表
|
||||
// 封装翻转链表函数
|
||||
function reverseList(node:ListNode){
|
||||
let pre:ListNode = null
|
||||
while(node){
|
||||
// 借助第三个变量 进行翻转 有疑问可以看链表篇(https://www.programmercarl.com/链表理论基础.html#单链表)
|
||||
let temp:ListNode = node.next
|
||||
node.next = pre
|
||||
pre = node
|
||||
node = temp
|
||||
}
|
||||
return pre
|
||||
}
|
||||
|
||||
// 快慢指针 需要注意的我们需要保证slow指针指向在要分隔节点的上一个节点,因为是单链表,无法找到链表前面的节点(也可以使用js代码的方法,新增个变量用去记录前一个节点)
|
||||
let fast:ListNode = head.next
|
||||
let slow:ListNode = head
|
||||
while(fast){
|
||||
fast = fast.next
|
||||
//只有fast有值的情况下才继续移动 不然代码会出现异常
|
||||
if(fast) {
|
||||
fast = fast.next
|
||||
slow = slow.next
|
||||
}
|
||||
}
|
||||
|
||||
// 分隔链表
|
||||
let list2Head:ListNode = slow.next
|
||||
// 断开slow节点的next指针
|
||||
slow.next = null
|
||||
// 将后半部分进行翻转
|
||||
let list2 = reverseList(list2Head)
|
||||
|
||||
// 最后进行迭代对比节点的值即可
|
||||
while(head && list2){
|
||||
if(head.val != list2.val) return false
|
||||
head = head.next
|
||||
list2 = list2.next
|
||||
}
|
||||
|
||||
return true
|
||||
};
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
-----------------------
|
||||
|
Reference in New Issue
Block a user