|
33 | 33 |
|
34 | 34 | 我们首先将链表的所有元素都保存在数组中,然后再利用双指针遍历数组,进而来判断是否为回文。这个方法很容易理解,而且代码实现也比较简单。 |
35 | 35 |
|
| 36 | +**题目代码** |
| 37 | + |
36 | 38 | ```java |
37 | 39 | class Solution { |
38 | 40 | public boolean isPalindrome(ListNode head) { |
@@ -72,6 +74,10 @@ class Solution { |
72 | 74 |
|
73 | 75 |  |
74 | 76 |
|
| 77 | +#### **题目代码** |
| 78 | + |
| 79 | +Java Code: |
| 80 | + |
75 | 81 | ```java |
76 | 82 | class Solution { |
77 | 83 | public boolean isPalindrome(ListNode head) { |
@@ -129,3 +135,63 @@ class Solution { |
129 | 135 | } |
130 | 136 | ``` |
131 | 137 |
|
| 138 | +C++ Code: |
| 139 | + |
| 140 | +```cpp |
| 141 | +class Solution { |
| 142 | +public: |
| 143 | + bool isPalindrome(ListNode* head) { |
| 144 | + if (head == nullptr || head->next == nullptr) { |
| 145 | + return true; |
| 146 | + } |
| 147 | + //找到中间节点,也就是翻转的头节点,这个在昨天的题目中讲到 |
| 148 | + //但是今天和昨天有一些不一样的地方就是,如果有两个中间节点返回第一个,昨天的题目是第二个 |
| 149 | + ListNode * midenode = searchmidnode(head); |
| 150 | + //原地翻转链表,需要两个辅助指针。这个也是面试题目,大家可以做一下 |
| 151 | + //这里我们用的是midnode->next需要注意,因为我们找到的是中点,但是我们翻转的是后半部分 |
| 152 | + |
| 153 | + ListNode * backhalf = reverse(midenode->next); |
| 154 | + //遍历两部分链表,判断值是否相等 |
| 155 | + ListNode * p1 = head; |
| 156 | + ListNode * p2 = backhalf; |
| 157 | + while (p2 != nullptr) { |
| 158 | + if (p1->val != p2->val) { |
| 159 | + return false; |
| 160 | + } |
| 161 | + p1 = p1->next; |
| 162 | + p2 = p2->next; |
| 163 | + } |
| 164 | + // 还原链表并返回结果,这一步是需要注意的,我们不可以破坏初始结构,我们只是判断是否为回文, |
| 165 | + //当然如果没有这一步也是可以AC,但是面试的时候题目要求可能会有这一条。 |
| 166 | + midenode->next = reverse(backhalf); |
| 167 | + return true; |
| 168 | + } |
| 169 | + //找到中间的部分 |
| 170 | + ListNode * searchmidnode (ListNode * head) { |
| 171 | + ListNode * fast = new ListNode(-1); |
| 172 | + ListNode * slow = new ListNode(-1); |
| 173 | + fast = head; |
| 174 | + slow = head; |
| 175 | + //找到中点 |
| 176 | + while (fast->next != nullptr && fast->next->next != nullptr) { |
| 177 | + fast = fast->next->next; |
| 178 | + slow = slow->next; |
| 179 | + } |
| 180 | + return slow; |
| 181 | + } |
| 182 | + //翻转链表 |
| 183 | + ListNode * reverse (ListNode * slow) { |
| 184 | + ListNode * low = nullptr; |
| 185 | + ListNode * temp = nullptr; |
| 186 | + //翻转链表 |
| 187 | + while (slow != nullptr) { |
| 188 | + temp = slow->next; |
| 189 | + slow->next = low; |
| 190 | + low = slow; |
| 191 | + slow = temp; |
| 192 | + } |
| 193 | + return low; |
| 194 | + } |
| 195 | +}; |
| 196 | +``` |
| 197 | +
|
0 commit comments