feat: 新增0234ts代码块

This commit is contained in:
coderwei
2022-07-05 18:14:30 +08:00
parent b982b79830
commit 0e480c58f0

View File

@ -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
};
```
-----------------------