From 0e480c58f0f7cc66e77f09cac6231d049dc7f23f Mon Sep 17 00:00:00 2001 From: coderwei <916606569@qq.com> Date: Tue, 5 Jul 2022 18:14:30 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E0234ts=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0234.回文链表.md | 68 +++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/problems/0234.回文链表.md b/problems/0234.回文链表.md index f591fcef..fa31dede 100644 --- a/problems/0234.回文链表.md +++ b/problems/0234.回文链表.md @@ -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 +}; + +``` + -----------------------