Skip to content

Commit b043dc0

Browse files
committed
添加py和js,去除多于代码,补全代码缺漏
1 parent f7c6fe7 commit b043dc0

File tree

1 file changed

+133
-33
lines changed

1 file changed

+133
-33
lines changed

animation-simulation/链表篇/234. 回文链表.md

Lines changed: 133 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -161,37 +161,35 @@ Java Code:
161161
class Solution {
162162
public boolean isPalindrome(ListNode head) {
163163
if (head==null || head.next==null) {
164-
return true;
164+
return true;
165165
}
166166
//找到中间节点,也就是翻转的头节点,这个在昨天的题目中讲到
167167
//但是今天和昨天有一些不一样的地方就是,如果有两个中间节点返回第一个,昨天的题目是第二个
168-
ListNode midenode = searchmidnode(head);
168+
ListNode midenode = searchmidnode(head);
169169
//原地翻转链表,需要两个辅助指针。这个也是面试题目,大家可以做一下
170170
//这里我们用的是midnode.next需要注意,因为我们找到的是中点,但是我们翻转的是后半部分
171-
172171
ListNode backhalf = reverse(midenode.next);
173172
//遍历两部分链表,判断值是否相等
174173
ListNode p1 = head;
175174
ListNode p2 = backhalf;
176175
while (p2 != null) {
177176
if (p1.val != p2.val) {
178-
return false;
177+
//若要还原,记得这里也要reverse
178+
midenode.next = reverse(backhalf);
179+
return false;
179180
}
180181
p1 = p1.next;
181182
p2 = p2.next;
182183
}
183-
// 还原链表并返回结果,这一步是需要注意的,我们不可以破坏初始结构,我们只是判断是否为回文,
184+
//还原链表并返回结果这一步是需要注意的,我们不可以破坏初始结构,我们只是判断是否为回文,
184185
//当然如果没有这一步也是可以AC,但是面试的时候题目要求可能会有这一条。
185186
midenode.next = reverse(backhalf);
186187
return true;
187188
}
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;
195193
while (fast.next != null && fast.next.next != null) {
196194
fast = fast.next.next;
197195
slow = slow.next;
@@ -202,12 +200,11 @@ class Solution {
202200
public ListNode reverse (ListNode slow) {
203201
ListNode low = null;
204202
ListNode temp = null;
205-
//翻转链表
206203
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;
211208
}
212209
return low;
213210
}
@@ -223,35 +220,33 @@ public:
223220
if (head == nullptr || head->next == nullptr) {
224221
return true;
225222
}
226-
//找到中间节点,也就是翻转的头节点,这个在昨天的题目中讲到
223+
//找到中间节点,也就是翻转的头节点这个在昨天的题目中讲到
227224
//但是今天和昨天有一些不一样的地方就是,如果有两个中间节点返回第一个,昨天的题目是第二个
228-
ListNode * midenode = searchmidnode(head);
225+
ListNode * midenode = searchmidnode(head);
229226
//原地翻转链表,需要两个辅助指针。这个也是面试题目,大家可以做一下
230227
//这里我们用的是midnode->next需要注意,因为我们找到的是中点,但是我们翻转的是后半部分
231-
232228
ListNode * backhalf = reverse(midenode->next);
233229
//遍历两部分链表,判断值是否相等
234230
ListNode * p1 = head;
235231
ListNode * p2 = backhalf;
236232
while (p2 != nullptr) {
237233
if (p1->val != p2->val) {
238-
return false;
234+
//若要还原,记得这里也要reverse
235+
midenode.next = reverse(backhalf);
236+
return false;
239237
}
240238
p1 = p1->next;
241239
p2 = p2->next;
242240
}
243-
// 还原链表并返回结果,这一步是需要注意的,我们不可以破坏初始结构,我们只是判断是否为回文,
241+
//还原链表并返回结果这一步是需要注意的,我们不可以破坏初始结构,我们只是判断是否为回文,
244242
//当然如果没有这一步也是可以AC,但是面试的时候题目要求可能会有这一条。
245243
midenode->next = reverse(backhalf);
246244
return true;
247245
}
248246
//找到中间的部分
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;
255250
while (fast->next != nullptr && fast->next->next != nullptr) {
256251
fast = fast->next->next;
257252
slow = slow->next;
@@ -262,15 +257,120 @@ public:
262257
ListNode * reverse (ListNode * slow) {
263258
ListNode * low = nullptr;
264259
ListNode * temp = nullptr;
265-
//翻转链表
266260
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;
271265
}
272266
return low;
273267
}
274268
};
275269
```
276270
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

Comments
 (0)