Partition List
Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.
You should preserve the original relative order of the nodes in each of the two partitions.
For example,
Given 1->4->3->2->5->2
and x = 3,
return 1->2->2->4->3->5
.
解法1:记录小于x的第一个node的位置。遍历list然后将小于x的node移到前面
ListNode* partition(ListNode* head, int x) {
if (head == NULL) return NULL;
ListNode* fakeHead = new ListNode(0);
fakeHead -> next = head;
ListNode* lastSmall = fakeHead;
ListNode* firstLarge = NULL;
ListNode* ptr = fakeHead;
while (ptr -> next != NULL){
if (ptr->next->val < x){
if (firstLarge){
ListNode* ptr2move = ptr -> next;
lastSmall -> next = ptr2move;
ptr -> next = lastSmall -> next;
ptr2move -> next = firstLarge;
lastSmall = ptr2move;
}
else
ptr = ptr -> next;
}
else {
if (!firstLarge){
lastSmall = ptr;
firstLarge = ptr -> next;
}
ptr = ptr -> next;
}
}
return fakeHead -> next;
}
ListNode* partition(ListNode* head, int x) {
//ListNode node1(0), node2(0); 这种写法也可以,记录一下
//ListNode *p1 = &node1, *p2 = &node2;
ListNode* s = new ListNode(0);
ListNode* l = new ListNode(0);
ListNode* sH = s;
ListNode* lH = l;
while (head){
if (head -> val < x)
s = s -> next = head;
else
l = l -> next = head;
head = head -> next;
}
l -> next = NULL; //这句必须有,测试用例应该是没有NULL不停止,所以指针会一直乱走
s -> next = lH -> next;
return sH -> next;
}
Valid PalindromeGiven a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.
For example,
"A man, a plan, a canal: Panama"
is a palindrome.
"race a car"
is not a palindrome.
Note:
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.
使用两个指针分别从前后开始移动。注意c++中可以使用isalnum()函数来判断是否是alphanumeric characters
bool isPalindrome(string s) {
for (int i = 0, j = s.size() - 1; i < j; i++, j--) { // Move 2 pointers from each end until they collide
while (isalnum(s[i]) == false && i < j) i++; // Increment left pointer if not alphanumeric
while (isalnum(s[j]) == false && i < j) j--; // Decrement right pointer if no alphanumeric
if (toupper(s[i]) != toupper(s[j])) return false; // Exit and return error if not match
}
return true;
}