bool isPalindrome(ListNode* head) { 
        int node_num = 0;

        //O(n) compute list length
        ListNode* tmp = head;
        while (tmp != NULL) {
            tmp = tmp->next;
            ++node_num;
        }
        if (node_num <= 1) {
            return true;
        }
        
        //O(n) split into two lists
        tmp = head;
        ListNode* revert_head = NULL;
        ListNode* forward_head = NULL;
        ListNode* middle_node = NULL;
        int current_index = 1;
        int revert_head_index = node_num / 2;
        int forward_head_index = (node_num + 1) / 2 + 1;
        while (current_index < revert_head_index && tmp != NULL) {
            tmp = tmp->next;
            ++current_index;
        }
        revert_head = tmp;
        middle_node = tmp->next;

        while (current_index < forward_head_index && tmp != NULL) {
            tmp = tmp->next;
            ++current_index;
        }
        forward_head = tmp;

        //O(n) revert the first half list
        revertList(head, revert_head);

        //O(n) compare two lists
        ListNode* tmp_revert_node = revert_head;
        ListNode* tmp_forward_node = forward_head;
        bool is_palindrome = true;
        while (tmp_revert_node != NULL) {
            if (tmp_revert_node->val != tmp_forward_node->val) {
                is_palindrome = false;
                break;
            }
            tmp_revert_node  = tmp_revert_node->next;
            tmp_forward_node = tmp_forward_node->next;
        }

        //O(n) reset the list so that the original program can free the memory
        revertList(revert_head, head);
        revert_head->next = middle_node;

        return is_palindrome;
    } 
Esempio n. 2
0
int main()
{
	PNode pLinkList = NULL;
	
	for (int i = 0; i < 10; i++)
	{
		addNode(&pLinkList, i);
	}
	printf("print the list:\n");
	printList(pLinkList);

	revertList(&pLinkList);

	printf("\n after being reverted:\n");
	printList(pLinkList);
	return 0;
}
Esempio n. 3
0
int main(int argc, char const *argv[])
{
  node *list = NULL;
  for(int i = 1; i <= ST_ELEMENTOV; i++)
    list = addItemEnd(list, i);

  node *reverted = revertList(list);

  print(list);

  printf("------ Obrnjen: ------\n");
  
  print(reverted);

  free(reverted);
  free(list);
  return 0;
}