File tree 2 files changed +66
-1
lines changed 2 files changed +66
-1
lines changed Original file line number Diff line number Diff line change @@ -266,4 +266,6 @@ gcc Quack.c revarg.c
266
266
267
267
[Leetcode 203 移除链表元素题解](linkedlist/leetcode203.md)
268
268
269
- [Leetcode 2 两数相加](linkedlist/leetcode2.md)
269
+ [Leetcode 2 两数相加](linkedlist/leetcode2.md)
270
+
271
+ [Leetcode 234 回文链表题解](linkedlist/leetcode234.md)
Original file line number Diff line number Diff line change
1
+ ### 描述
2
+ 请判断一个链表是否为回文链表。
3
+
4
+ 示例 1:
5
+
6
+ 输入: 1->2
7
+ 输出: false
8
+ 示例 2:
9
+
10
+ 输入: 1->2->2->1
11
+ 输出: true
12
+
13
+ [ 点击此处查看原题] ( https://leetcode-cn.com/problems/palindrome-linked-list/ )
14
+
15
+
16
+ ### 思路
17
+
18
+ 这个题目在难度分类是简单题,但是这题给我很多启发,个人认为应该属于中等题。
19
+ 题目有个进阶的要求是,能否在O(n)和O(1)的空间复杂度解决这个问题,首先我们考虑一种比较暴力的想法是,我们开一个数组,然后遍历一下这个链表,把值都抄进去,那么我们可以用双指针的方法来判断是不是回文了(因为单链表没法倒着来)。那么这里就不浪费时间在这个代码上,大家可以自行把代码写完。
20
+
21
+ 这里想介绍一个递归的思路,然后加强一下自己对递归的理解。
22
+ 我们再次回顾一下递归,我们想一下反向打印字符串的代码。
23
+
24
+ 假如我们有个char[ ] ,我们怎么反向打印呢?
25
+
26
+ 我们可能可以想出答案:自底向上。
27
+
28
+
29
+ ``` c
30
+ void printArr (const char* str) {
31
+ if (* str == '\0') {
32
+ return;
33
+ }
34
+ printArr(str + 1);
35
+ putchar(* str);
36
+ }
37
+ ```
38
+ 举一反三, 栈帧可以帮助我们来从后往前,那我们只需要一个从前往后的指针就可以了。
39
+
40
+ ```java
41
+ class Solution {
42
+ ListNode frontHead; // 从前往后的指针
43
+
44
+ public boolean recursiveCheck(ListNode head) {
45
+ if (head != null) {
46
+ if (!recursiveCheck(head.next)) return false; // 我们先摸到后面来
47
+ if (head.val != frontHead.val) return false;
48
+ frontHead = frontHead.next;
49
+ }
50
+ return true;
51
+ }
52
+ public boolean isPalindrome(ListNode head) {
53
+ frontHead = head;
54
+ return recursiveCheck(head);
55
+ }
56
+ }
57
+ ```
58
+
59
+ 相信走到这里,对于递归的理解能加深不少。
60
+ 当然,这个解法也不是符合进阶要求的O(n)时间复杂度,O(1)空间复杂度的解法。
61
+ 大家有兴趣可以去探索一下。
62
+
63
+
You can’t perform that action at this time.
0 commit comments