From ad99029c24c335ae1a788419281a0f2f62453af3 Mon Sep 17 00:00:00 2001 From: weiss-ben Date: Sat, 10 Sep 2022 17:52:27 +0300 Subject: [PATCH] feat: add new median search algorithm with linked list --- search/median_search2.cpp | 124 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 search/median_search2.cpp diff --git a/search/median_search2.cpp b/search/median_search2.cpp new file mode 100644 index 000000000..d2646c313 --- /dev/null +++ b/search/median_search2.cpp @@ -0,0 +1,124 @@ +/** + * @file median_search2.cpp + * + * @details + * Given a linked list L[0,....,n] of n numbers, find the middle node. + * + * Here are some example lists you can use to see how the algorithm works + * A = [1,2,3,4,5] + * B = [1,2,3,4,5,6] + * print median(A) #should be 39 + * print median(B) #should be 4 + * + * @author [Benjamin Weiss](https://github.com/weiss-ben) + */ + +/** + * Definition for singly-linked list. + */ +struct ListNode { + int val; + ListNode *next; + ListNode() : val(0), next(nullptr) {} + ListNode(int x) : val(x), next(nullptr) {} + ListNode(int x, ListNode *next) : val(x), next(next) {} + }; + + #include + #include + +/** + * @namespace search + * @brief Search algorithms + */ +namespace search { +/** + * @namespace median_search + */ +namespace median_search2 { +/** +* This function searches for the median of a linked list. +* @param head, The head of the linked list. +* @returns Median node of the linked list. +*/ +ListNode* middleNode(ListNode* head) { + if(!head) + return nullptr; + + //Fast and slow pointers + ListNode* fastptr; + ListNode* slowptr = fastptr = head; + + // fast jumps 2 while slow jumps 1 + while(fastptr->next && fastptr->next->next) { + slowptr = slowptr->next; + fastptr = fastptr->next->next; + } + return (fastptr->next) ? slowptr->next : slowptr; + +} +} // namespace median_search2 +} // namespace search + +/** + * Function to test above algorithm + */ +void test(){ + ListNode* head = new ListNode; + head->val = 1; + + ListNode* temp1 = head; + for(int i = 1; i < 6; ++i) + { + ListNode* temp2 = new ListNode; + temp2->val = i; + + temp1->next = temp2; + temp1 = temp2; + } + + ListNode* median = search::median_search2::middleNode(head); + assert(3 == median->val); // 3 is the value of the median node. + std::cout << "test case:1 passed\n"; + + // Clean up + while(head) + { + ListNode* t = head->next; + delete head; + } + + ListNode* head = new ListNode; + head->val = 1; + + ListNode* temp1 = head; + for(int i = 1; i < 7; ++i) + { + ListNode* temp2 = new ListNode; + temp2->val = i; + + temp1->next = temp2; + temp1 = temp2; + } + + ListNode* median = search::median_search2::middleNode(head); + assert(4 == median->val); // 3 is the value of the median node. + std::cout << "test case:1 passed\n"; + + // Clean up + while(head) + { + ListNode* t = head->next; + delete head; + } + std::cout << "--All tests passed--\n"; +} + +/** + * Main function + */ +int main() +{ + test(); + return 0; +}