@@ -161,37 +161,35 @@ Java Code:
161
161
class Solution {
162
162
public boolean isPalindrome (ListNode head ) {
163
163
if (head== null || head. next== null ) {
164
- return true ;
164
+ return true ;
165
165
}
166
166
// 找到中间节点,也就是翻转的头节点,这个在昨天的题目中讲到
167
167
// 但是今天和昨天有一些不一样的地方就是,如果有两个中间节点返回第一个,昨天的题目是第二个
168
- ListNode midenode = searchmidnode(head);
168
+ ListNode midenode = searchmidnode(head);
169
169
// 原地翻转链表,需要两个辅助指针。这个也是面试题目,大家可以做一下
170
170
// 这里我们用的是midnode.next需要注意,因为我们找到的是中点,但是我们翻转的是后半部分
171
-
172
171
ListNode backhalf = reverse(midenode. next);
173
172
// 遍历两部分链表,判断值是否相等
174
173
ListNode p1 = head;
175
174
ListNode p2 = backhalf;
176
175
while (p2 != null ) {
177
176
if (p1. val != p2. val) {
178
- return false ;
177
+ // 若要还原,记得这里也要reverse
178
+ midenode. next = reverse(backhalf);
179
+ return false ;
179
180
}
180
181
p1 = p1. next;
181
182
p2 = p2. next;
182
183
}
183
- // 还原链表并返回结果, 这一步是需要注意的,我们不可以破坏初始结构,我们只是判断是否为回文,
184
+ // 还原链表并返回结果, 这一步是需要注意的,我们不可以破坏初始结构,我们只是判断是否为回文,
184
185
// 当然如果没有这一步也是可以AC,但是面试的时候题目要求可能会有这一条。
185
186
midenode. next = reverse(backhalf);
186
187
return true ;
187
188
}
188
- // 找到中间的部分
189
- public ListNode searchmidnode (ListNode head ) {
190
- ListNode fast = new ListNode (- 1 );
191
- ListNode slow = new ListNode (- 1 );
192
- fast = head;
193
- slow = head;
194
- // 找到中点
189
+ // 找到中点
190
+ public ListNode searchmidnode (ListNode head ) {
191
+ ListNode fast = head;
192
+ ListNode slow = head;
195
193
while (fast. next != null && fast. next. next != null ) {
196
194
fast = fast. next. next;
197
195
slow = slow. next;
@@ -202,12 +200,11 @@ class Solution {
202
200
public ListNode reverse (ListNode slow ) {
203
201
ListNode low = null ;
204
202
ListNode temp = null ;
205
- // 翻转链表
206
203
while (slow != null ) {
207
- temp = slow. next;
208
- slow. next = low;
209
- low = slow;
210
- slow = temp;
204
+ temp = slow. next;
205
+ slow. next = low;
206
+ low = slow;
207
+ slow = temp;
211
208
}
212
209
return low;
213
210
}
@@ -223,35 +220,33 @@ public:
223
220
if (head == nullptr || head->next == nullptr) {
224
221
return true;
225
222
}
226
- //找到中间节点,也就是翻转的头节点, 这个在昨天的题目中讲到
223
+ //找到中间节点,也就是翻转的头节点, 这个在昨天的题目中讲到
227
224
//但是今天和昨天有一些不一样的地方就是,如果有两个中间节点返回第一个,昨天的题目是第二个
228
- ListNode * midenode = searchmidnode(head);
225
+ ListNode * midenode = searchmidnode(head);
229
226
//原地翻转链表,需要两个辅助指针。这个也是面试题目,大家可以做一下
230
227
//这里我们用的是midnode->next需要注意,因为我们找到的是中点,但是我们翻转的是后半部分
231
-
232
228
ListNode * backhalf = reverse(midenode->next);
233
229
//遍历两部分链表,判断值是否相等
234
230
ListNode * p1 = head;
235
231
ListNode * p2 = backhalf;
236
232
while (p2 != nullptr) {
237
233
if (p1->val != p2->val) {
238
- return false;
234
+ //若要还原,记得这里也要reverse
235
+ midenode.next = reverse(backhalf);
236
+ return false;
239
237
}
240
238
p1 = p1->next;
241
239
p2 = p2->next;
242
240
}
243
- // 还原链表并返回结果, 这一步是需要注意的,我们不可以破坏初始结构,我们只是判断是否为回文,
241
+ //还原链表并返回结果, 这一步是需要注意的,我们不可以破坏初始结构,我们只是判断是否为回文,
244
242
//当然如果没有这一步也是可以AC,但是面试的时候题目要求可能会有这一条。
245
243
midenode->next = reverse(backhalf);
246
244
return true;
247
245
}
248
246
//找到中间的部分
249
- ListNode * searchmidnode (ListNode * head) {
250
- ListNode * fast = new ListNode(-1);
251
- ListNode * slow = new ListNode(-1);
252
- fast = head;
253
- slow = head;
254
- //找到中点
247
+ ListNode * searchmidnode (ListNode * head) {
248
+ ListNode * fast = head;
249
+ ListNode * slow = head;
255
250
while (fast->next != nullptr && fast->next->next != nullptr) {
256
251
fast = fast->next->next;
257
252
slow = slow->next;
@@ -262,15 +257,120 @@ public:
262
257
ListNode * reverse (ListNode * slow) {
263
258
ListNode * low = nullptr;
264
259
ListNode * temp = nullptr;
265
- //翻转链表
266
260
while (slow != nullptr) {
267
- temp = slow->next;
268
- slow->next = low;
269
- low = slow;
270
- slow = temp;
261
+ temp = slow->next;
262
+ slow->next = low;
263
+ low = slow;
264
+ slow = temp;
271
265
}
272
266
return low;
273
267
}
274
268
};
275
269
```
276
270
271
+ JS Code:
272
+
273
+ ```javascript
274
+ var isPalindrome = function(head) {
275
+ if (head === null || head.next === null) {
276
+ return true;
277
+ }
278
+ //找到中间节点,也就是翻转的头节点,这个在昨天的题目中讲到
279
+ //但是今天和昨天有一些不一样的地方就是,如果有两个中间节点返回第一个,昨天的题目是第二个
280
+ let midenode = searchmidnode(head);
281
+ //原地翻转链表,需要两个辅助指针。这个也是面试题目,大家可以做一下
282
+ //这里我们用的是midnode.next需要注意,因为我们找到的是中点,但是我们翻转的是后半部分
283
+ let backhalf = reverse(midenode.next);
284
+ //遍历两部分链表,判断值是否相等
285
+ let p1 = head;
286
+ let p2 = backhalf;
287
+ while (p2 != null) {
288
+ if (p1.val != p2.val) {
289
+ //若要还原,记得这里也要reverse
290
+ midenode.next = reverse(backhalf);
291
+ return false;
292
+ }
293
+ p1 = p1.next;
294
+ p2 = p2.next;
295
+ }
296
+ //还原链表并返回结果,这一步是需要注意的,我们不可以破坏初始结构,我们只是判断是否为回文,
297
+ //当然如果没有这一步也是可以AC,但是面试的时候题目要求可能会有这一条。
298
+ midenode.next = reverse(backhalf);
299
+ return true;
300
+ };
301
+
302
+ //找到中点
303
+ var searchmidnode = function(head) {
304
+ let fast = head;
305
+ let slow = head;
306
+ while (fast.next != null && fast.next.next != null) {
307
+ fast = fast.next.next;
308
+ slow = slow.next;
309
+ }
310
+ return slow;
311
+ };
312
+
313
+ //翻转链表
314
+ var reverse = function(slow) {
315
+ let low = null;
316
+ let temp = null;
317
+ while (slow != null) {
318
+ temp = slow.next;
319
+ slow.next = low;
320
+ low = slow;
321
+ slow = temp;
322
+ }
323
+ return low;
324
+ };
325
+ ```
326
+
327
+ Python Code:
328
+
329
+ ``` py
330
+ class Solution :
331
+ def isPalindrome (self , head : ListNode) -> bool :
332
+ if head is None or head.next is None :
333
+ return True
334
+ # 找到中间节点,也就是翻转的头节点,这个在昨天的题目中讲到
335
+ # 但是今天和昨天有一些不一样的地方就是,如果有两个中间节点返回第一个,昨天的题目是第二个
336
+ midnode = self .searchmidnode(head)
337
+ # 原地翻转链表,需要两个辅助指针。这个也是面试题目,大家可以做一下
338
+ # 这里我们用的是midnode.next需要注意,因为我们找到的是中点,但是我们翻转的是后半部分
339
+ backhalf = self .reverse(midnode.next)
340
+ # 遍历两部分链表,判断值是否相等
341
+ p1 = head
342
+ p2 = backhalf
343
+ while p2 is not None :
344
+ if p1.val != p2.val:
345
+ # 若要还原,记得这里也要reverse
346
+ midnode.next = self .reverse(backhalf)
347
+ print (head)
348
+ return False
349
+ p1 = p1.next
350
+ p2 = p2.next
351
+ # 还原链表并返回结果,这一步是需要注意的,我们不可以破坏初始结构,我们只是判断是否为回文,
352
+ 当然如果没有这一步也是可以AC ,但是面试的时候题目要求可能会有这一条。
353
+ midnode.next = self .reverse(backhalf)
354
+ return True
355
+
356
+ # 找到中点
357
+ def searchmidnode (self , head ):
358
+ fast = head
359
+ slow = head
360
+ while fast.next is not None and fast.next.next is not None :
361
+ fast = fast.next.next
362
+ slow = slow.next
363
+ return slow
364
+
365
+ # 翻转链表
366
+ def reverse (self , slow ):
367
+ low = None
368
+ temp = None
369
+ while slow is not None :
370
+ temp = slow.next
371
+ slow.next = low
372
+ low = slow
373
+ slow = temp
374
+ return low
375
+ ```
376
+
0 commit comments