链表检测回文串
来源:4-5 从链表中删除元素
慕粉3884565
2022-07-01
function solution(head) { if (head == null || head.next == null) { return true; } let prev; let slow = head; let fast = head; let i = 0; while (fast != null && fast.next != null) { fast = fast.next.next; let next = slow.next; slow.next = prev; prev = slow; slow = next; i++; } console.log(i); if (fast != null) { slow = slow.next; } console.log(slow); console.log(prev); while (slow != null) { if (slow.data != prev.data) { return false; } slow = slow.next; prev = prev.next; } return true; }
这是采用链表检测回文串
第一个红框逻辑便是将slow遍历到整个链表2/1位置
但是第二个红框进行比较不是很懂,prev逻辑有点懵逼 老师能够详细讲讲吗
详细讲讲算法流程
写回答
1回答
-
第一个红框的代码不仅仅将 slow 遍历到了链表 1/2 的位置,还把链表前半部分翻转了。所以,在第二个红框的部分,slow 在从链表的中间,向前遍历;prev 在从链表的中间,向后遍历。每次 slow 和 prev 指向的内容相同,才说明是回文串,否则就不是。
这里面存在很多细节。我的建议是,请你使用一个小的测试用例,比如包含 6 个节点,或者 7 个节点,或者 8 个节点的测试用例,实际去运行这个程序,用单步跟踪的方式去看,程序运行的过程中,每一步,各个变量在怎么变化,每个变量指向了哪个节点,每个节点的 next 又指向了哪个节点。在每一步链表变成了什么样子。
你可以使用纸笔去辅助,像课程 ppt 中的图示那样,画出整个链表的变化过程。去理解这个程序究竟是怎么运行的,为什么能正确的出回文(或者对于不是会问的情况,检测出他不是回文。)
继续加油!:)
022022-07-15
相似问题