234. Palindrome Linked List
Given a singly linked list, determine if it is a palindrome.
Follow up:
Could you do it in O(n) time and O(1) space?
題目大意:
判斷一個單連結清單是否為回文連結清單。
思路:
找到連結清單中間的節點,将連結清單從中間分為2部分,右半部分進行連結清單反向轉換,然後左半部分和反轉後的右半部分連結清單進行比較。得出結果。
代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<code>/**</code>
<code> </code><code>* Definition for singly-linked list.</code>
<code> </code><code>* struct ListNode {</code>
<code> </code><code>* int val;</code>
<code> </code><code>* ListNode *next;</code>
<code> </code><code>* ListNode(int x) : val(x), next(NULL) {}</code>
<code> </code><code>* };</code>
<code> </code><code>*/</code>
<code>class</code> <code>Solution {</code>
<code>public</code><code>:</code>
<code> </code><code>ListNode * reverseList(ListNode *head) </code><code>//連結清單反轉</code>
<code> </code><code>{</code>
<code> </code><code>ListNode *pre,*next;</code>
<code> </code><code>pre = NULL;</code>
<code> </code><code>next = NULL;</code>
<code> </code>
<code> </code><code>while</code><code>(head)</code>
<code> </code><code>{</code>
<code> </code><code>next = head->next;</code>
<code> </code><code>head->next = pre;</code>
<code> </code><code>pre = head;</code>
<code> </code><code>head = next;</code>
<code> </code><code>}</code>
<code> </code><code>return</code> <code>pre;</code>
<code> </code><code>}</code>
<code> </code><code>bool</code> <code>isPalindrome(ListNode* head) {</code>
<code> </code><code>if</code><code>( NULL == head || NULL == head->next)</code>
<code> </code><code>return</code> <code>true</code><code>;</code>
<code> </code><code>int</code> <code>len = 0;</code>
<code> </code><code>ListNode *p = head;</code>
<code> </code><code>while</code><code>(p)</code>
<code> </code><code>len++;</code>
<code> </code><code>p = p->next;</code>
<code> </code><code>ListNode * rightListHead;</code>
<code> </code><code>rightListHead = head;</code>
<code> </code><code>int</code> <code>leftLen = len / 2;</code>
<code> </code><code>int</code> <code>rightLen = len - leftLen;</code>
<code> </code><code>int</code> <code>i = leftLen;</code>
<code> </code><code>while</code><code>(i)</code>
<code> </code><code>rightListHead = rightListHead->next;</code>
<code> </code><code>i--;</code>
<code> </code><code>rightListHead = reverseList(rightListHead);</code>
<code> </code><code>ListNode * left = head;</code>
<code> </code><code>ListNode * right = rightListHead;</code>
<code> </code><code>while</code><code>(i < leftLen)</code>
<code> </code><code>if</code><code>(left->val == right->val)</code>
<code> </code><code>{</code>
<code> </code><code>left = left->next;</code>
<code> </code><code>right = right->next;</code>
<code> </code><code>}</code>
<code> </code><code>else</code>
<code> </code><code>return</code> <code>false</code><code>;</code>
<code> </code><code>i++;</code>
<code> </code><code>return</code> <code>true</code><code>;</code>
<code>};</code>
複習了單連結清單反轉的方法。
本文轉自313119992 51CTO部落格,原文連結:http://blog.51cto.com/qiaopeng688/1837428