1. Palindrome linked list
这个解法很不错呀 利用了reverse linked list的方法 + 两个指针
class Solution {
public:
ListNode* reverse(ListNode* node)
{
ListNode* prev = NULL;
while (node != NULL)
{
ListNode* temp = node->next;
node->next = prev;
prev = node;
node = temp;
}
return prev;
}
bool isPalindrome(ListNode* head) {
if (head == NULL || head->next == NULL)
{
return true;
}
ListNode* p1 = head;
ListNode* p2 = head->next;
while (p1 != NULL && p2!= NULL && p2->next != NULL)
{
p1 = p1->next;
p2 = p2->next->next;
}
p1->next = reverse (p1->next);
p1 = p1->next;
while (p1 != NULL)
{
if (head->val != p1->val)
return false;
p1 = p1->next;
head = head->next;
}
return true;
}
};
个人觉得 p2 从 head->next开始比较好 这样的话奇数个node 正好到中间 偶数个的会在前面的那一个
2.valid palindrome
Have you consider that the string might be empty? This is a good question to ask during an interview.For the purpose of this problem, we define empty string as valid palindrome.
<span style="font-size:12px;">class Solution {
public:
bool isPalindrome(string s) {
if (s.size() == 0 || s.size() == 1)
{
return true;
}
int i = 0;
int j = s.length() - 1;
for (i,j; i < j; ++i, --j)
{
while (isalnum(s[i]) == false && i < j)
{
i++;
}
while (isalnum(s[j]) == false && i < j )
{
j--;
}
if (toupper(s[i]) != toupper(s[j]))
{
return false;
}
}
return true;
}
};</span>
关键是while loop 的后面的两个i < j 不能忘了!!!!!
3. Palindrome Number
方法1:
Reverse Integer的变体 不过负数直接就不是palindrome
class Solution {
public:
bool isPalindrome(int x) {
if (x == 0)
return true;
else if (x < 0)
return false;
int result = 0;
result = reverseInteger(x);
if (result == x)
{
return true;
}
else
return false;
}
int reverseInteger(int x)
{
int result = 0;
while (x != 0)
{
int mod = x % 10;
result = result * 10 + mod;
x = x /10;
}
if ((result >= 2147483647) || (result <= -2147483648))
{
return 0;
}
return result;
}
};
summary: 1.两个指针 快慢指针找到linked list的中点 2. Reverse linked list 3. insert linked list 同时要考虑结尾为NULL的情况
只要reverse half of the linked list 有点 两边向中间靠近的意思