File tree 1 file changed +77
-0
lines changed
data_structures/linked_list
1 file changed +77
-0
lines changed Original file line number Diff line number Diff line change
1
+ def is_palindrome(head):
2
+ if not head:
3
+ return True
4
+ # split the list to two parts
5
+ fast, slow = head.next, head
6
+ while fast and fast.next:
7
+ fast = fast.next.next
8
+ slow = slow.next
9
+ second = slow.next
10
+ slow.next = None # Don't forget here! But forget still works!
11
+ # reverse the second part
12
+ node = None
13
+ while second:
14
+ nxt = second.next
15
+ second.next = node
16
+ node = second
17
+ second = nxt
18
+ # compare two parts
19
+ # second part has the same or one less node
20
+ while node:
21
+ if node.val != head.val:
22
+ return False
23
+ node = node.next
24
+ head = head.next
25
+ return True
26
+
27
+
28
+ def is_palindrome_stack(head):
29
+ if not head or not head.next:
30
+ return True
31
+
32
+ # 1. Get the midpoint (slow)
33
+ slow = fast = cur = head
34
+ while fast and fast.next:
35
+ fast, slow = fast.next.next, slow.next
36
+
37
+ # 2. Push the second half into the stack
38
+ stack = [slow.val]
39
+ while slow.next:
40
+ slow = slow.next
41
+ stack.append(slow.val)
42
+
43
+ # 3. Comparison
44
+ while stack:
45
+ if stack.pop() != cur.val:
46
+ return False
47
+ cur = cur.next
48
+
49
+ return True
50
+
51
+
52
+ def is_palindrome_dict(head):
53
+ if not head or not head.next:
54
+ return True
55
+ d = {}
56
+ pos = 0
57
+ while head:
58
+ if head.val in d.keys():
59
+ d[head.val].append(pos)
60
+ else:
61
+ d[head.val] = [pos]
62
+ head = head.next
63
+ pos += 1
64
+ checksum = pos - 1
65
+ middle = 0
66
+ for v in d.values():
67
+ if len(v) % 2 != 0:
68
+ middle += 1
69
+ else:
70
+ step = 0
71
+ for i in range(0, len(v)):
72
+ if v[i] + v[len(v) - 1 - step] != checksum:
73
+ return False
74
+ step += 1
75
+ if middle > 1:
76
+ return False
77
+ return True
You can’t perform that action at this time.
0 commit comments