예제 #1
0
        public void LinkedListSingleLinkFindIntersection2OptimizedCompleteTest3SameList()
        {
            // Note that since we need intersecting nodes, we can't use our helpers
            // to construct these lists.

            // Construct:
            // 11 -> 12 -> 13

            // Initialize first list.
            var third1 = new LinkedListSingleLinkNode <int>
            {
                Value = 13
            };

            var second1 = new LinkedListSingleLinkNode <int>
            {
                Next  = third1,
                Value = 12
            };

            var first1 = new LinkedListSingleLinkNode <int>
            {
                Next  = second1,
                Value = 11
            };

            // Do check.
            Assert.AreEqual(first1, LinkedListSingleLinkFindIntersection2OptimizedComplete.FindIntersection(first1, first1));
        }
        /// <summary>
        /// Find the first intersecting node between two lists.
        /// </summary>
        /// <param name="list1">The first list.</param>
        /// <param name="list2">The second list.</param>
        /// <returns>The first intersecting node or null if no intersection.</returns>
        public static LinkedListSingleLinkNode <int> FindIntersection(LinkedListSingleLinkNode <int> list1, LinkedListSingleLinkNode <int> list2)
        {
            // Check all nodes in list 1.
            var curr1 = list1;

            while (curr1 != null)
            {
                // Compare all nodes in list 2.
                var curr2 = list2;
                while (curr2 != null)
                {
                    // If they match we are done.
                    if (curr1 == curr2)
                    {
                        return(curr1);
                    }

                    // Advance.
                    curr2 = curr2.Next;
                }

                // Advance.
                curr1 = curr1.Next;
            }

            // No match.
            return(null);
        }
        public void LinkedListSingleLinkPartition3NonStableCompleteTest1NullList()
        {
            LinkedListSingleLinkNode <int> actual = null;

            LinkedListSingleLinkPartition3NonStableComplete.Partition(ref actual, 7);
            Assert.IsTrue(LinkedListSingleLinkNode <int> .Compare(null, actual));
        }
        public void LinkedListSingleLinkPartition3NonStableCompleteTest7AllBefore()
        {
            var actual = LinkedListSingleLinkNode <int> .CreateFromData(1, 2, 8, 7, 5, 3);

            var expected = LinkedListSingleLinkNode <int> .CreateFromData(3, 5, 7, 8, 2, 1);

            LinkedListSingleLinkPartition3NonStableComplete.Partition(ref actual, 9);
            Assert.IsTrue(LinkedListSingleLinkNode <int> .Compare(expected, actual));
        }
예제 #5
0
        public void LinkedListSingleLinkPartition2StableUseDummyNodesTest8AllAfter()
        {
            var actual = LinkedListSingleLinkNode <int> .CreateFromData(1, 2, 8, 7, 5, 3);

            var expected = LinkedListSingleLinkNode <int> .CreateFromData(1, 2, 8, 7, 5, 3);

            LinkedListSingleLinkPartition2StableUseDummyNodesComplete.Partition(ref actual, 0);
            Assert.IsTrue(LinkedListSingleLinkNode <int> .Compare(expected, actual));
        }
        public void LinkedListSingleLinkPartition3NonStableCompleteTest6SingleBeforeAfter()
        {
            var actual = LinkedListSingleLinkNode <int> .CreateFromData(3, 2, 1);

            var expected = LinkedListSingleLinkNode <int> .CreateFromData(1, 3, 2);

            LinkedListSingleLinkPartition3NonStableComplete.Partition(ref actual, 2);
            Assert.IsTrue(LinkedListSingleLinkNode <int> .Compare(expected, actual));
        }
예제 #7
0
        public void LinkedListSingleLinkPartition1StableCompleteTest4SingleIsPartition()
        {
            var actual = LinkedListSingleLinkNode <int> .CreateFromData(1);

            var expected = LinkedListSingleLinkNode <int> .CreateFromData(1);

            LinkedListSingleLinkPartition1StableComplete.Partition(ref actual, 1);
            Assert.IsTrue(LinkedListSingleLinkNode <int> .Compare(expected, actual));
        }
예제 #8
0
        public void LinkedListSingleLinkPartition1StableCompleteTest9Default()
        {
            var actual = LinkedListSingleLinkNode <int> .CreateFromData(1, 2, 8, 7, 5, 3);

            var expected = LinkedListSingleLinkNode <int> .CreateFromData(1, 2, 5, 3, 8, 7);

            LinkedListSingleLinkPartition1StableComplete.Partition(ref actual, 7);
            Assert.IsTrue(LinkedListSingleLinkNode <int> .Compare(expected, actual));
        }
예제 #9
0
        public void LinkedListSingleLinkPartition2StableUseDummyNodesTest5SingleBefore()
        {
            var actual = LinkedListSingleLinkNode <int> .CreateFromData(3, 2);

            var expected = LinkedListSingleLinkNode <int> .CreateFromData(3, 2);

            LinkedListSingleLinkPartition2StableUseDummyNodesComplete.Partition(ref actual, 2);
            Assert.IsTrue(LinkedListSingleLinkNode <int> .Compare(expected, actual));
        }
예제 #10
0
        public void LinkedListSingleLinkFindIntersection2OptimizedCompleteTest5NullList2()
        {
            var first1 = new LinkedListSingleLinkNode <int>
            {
                Value = 11
            };

            // Do check.
            Assert.AreEqual(null, LinkedListSingleLinkFindIntersection2OptimizedComplete.FindIntersection(first1, null));
        }
예제 #11
0
        public void LinkedListSingleRemoveDuplicates2NoAdditionalDSCompleteTest6SingleNode()
        {
            // Create with helper.
            var actual = LinkedListSingleLinkNode <int> .CreateFromData(1);

            var expected = LinkedListSingleLinkNode <int> .CreateFromData(1);

            LinkedListSingleRemoveDuplicates2NoAdditionalDSComplete.RemoveDuplicates(actual);
            LinkedListSingleLinkNode <int> .Compare(expected, actual);
        }
        public void LinkedListSingleLinkSplit2FastSlowCompleteTestEmptyList()
        {
            // Split the list.
            LinkedListSingleLinkSplit2FastSlowComplete.Split(null, out LinkedListSingleLinkNode <int> ResultA, out LinkedListSingleLinkNode <int> ResultB, out LinkedListSingleLinkNode <int> ResultDropped);

            // Do the compare.
            Assert.IsTrue(LinkedListSingleLinkNode <int> .Compare(ResultA, null));
            Assert.IsTrue(LinkedListSingleLinkNode <int> .Compare(ResultB, null));
            Assert.IsTrue(LinkedListSingleLinkNode <int> .Compare(ResultDropped, null));
        }
        public void LinkedListSingleRemoveDuplicates1HashSetCompleteTest4SingleDup()
        {
            // Create with helper.
            var actual = LinkedListSingleLinkNode <int> .CreateFromData(1, 1, 1);

            var expected = LinkedListSingleLinkNode <int> .CreateFromData(1);

            LinkedListSingleRemoveDuplicates1HashSetComplete.RemoveDuplicates(actual);
            LinkedListSingleLinkNode <int> .Compare(expected, actual);
        }
        public void LinkedListSingleLinkFindIntersection1BruteForceCompleteTest4NullList1()
        {
            var first2 = new LinkedListSingleLinkNode <int>
            {
                Value = 21
            };

            // Do check.
            Assert.AreEqual(null, LinkedListSingleLinkFindIntersection1BruteForceComplete.FindIntersection(null, first2));
        }
        public void LinkedListSingleLinkReverse1TestEmptyListWithDefaults()
        {
            // List to reverse.
            LinkedListSingleLinkNode <int> toReverse = null;

            // Reverse the list.
            LinkedListSingleLinkReverse1Complete.Reverse(ref toReverse);

            // Do the compare.
            Assert.IsTrue(LinkedListSingleLinkNode <int> .Compare(toReverse, null));
        }
예제 #16
0
        public void LinkedListSingleLinkFindIntersection2OptimizedCompleteTest2NoIntersectionFound()
        {
            // Note that since we need intersecting nodes, we can't use our helpers
            // to construct these lists.

            // Construct:
            // 11 -> 12 -> 13
            // 21 -> 22 -> 23 -> 24

            // Initialize first list.
            var third1 = new LinkedListSingleLinkNode <int>
            {
                Value = 13
            };

            var second1 = new LinkedListSingleLinkNode <int>
            {
                Next  = third1,
                Value = 12
            };

            var first1 = new LinkedListSingleLinkNode <int>
            {
                Next  = second1,
                Value = 11
            };

            // Initialize second list.
            var fourth2 = new LinkedListSingleLinkNode <int>
            {
                Value = 24
            };

            var third2 = new LinkedListSingleLinkNode <int>
            {
                Next  = fourth2,
                Value = 23
            };

            var second2 = new LinkedListSingleLinkNode <int>
            {
                Next  = third2,
                Value = 22
            };

            var first2 = new LinkedListSingleLinkNode <int>
            {
                Next  = second2,
                Value = 21
            };

            // Do check.
            Assert.AreEqual(null, LinkedListSingleLinkFindIntersection2OptimizedComplete.FindIntersection(first1, first2));
        }
        public void LinkedListSingleLinkReverse1TestSingleElementWithDefaults()
        {
            // List to reverse.
            var toReverse = LinkedListSingleLinkNode <int> .CreateFromData(3);

            // Expected list.
            var expected = LinkedListSingleLinkNode <int> .CreateFromData(3);

            // Reverse the list.
            LinkedListSingleLinkReverse1Complete.Reverse(ref toReverse);

            // Do the compare.
            Assert.IsTrue(LinkedListSingleLinkNode <int> .Compare(toReverse, expected));
        }
        public void LinkedListSingleLinkReverse1TestMultipleElementsWithEndingNode()
        {
            // List to reverse.
            var toReverse = LinkedListSingleLinkNode <int> .CreateFromData(1, 2, 3, 4, 5);

            // Expected list.
            var expected = LinkedListSingleLinkNode <int> .CreateFromData(2, 1, 3, 4, 5);

            // Reverse the list.
            LinkedListSingleLinkReverse1Complete.Reverse(ref toReverse, endReverse: toReverse.Next);

            // Do the compare.
            Assert.IsTrue(LinkedListSingleLinkNode <int> .Compare(toReverse, expected));
        }
        public void LinkedListSingleLinkReverse1TestEndBeforeStartNode()
        {
            try
            {
                var toReverse = LinkedListSingleLinkNode <int> .CreateFromData(1, 2, 3);

                LinkedListSingleLinkReverse1Complete.Reverse(ref toReverse, toReverse.Next, toReverse);
            }
            catch (ArgumentException)
            {
                Assert.IsTrue(true);
                return;
            }
            Assert.Fail();
        }
        public void LinkedListSingleLinkReverse1TestInvalidEndNode()
        {
            try
            {
                var toReverse = LinkedListSingleLinkNode <int> .CreateFromData(1, 2, 3);

                LinkedListSingleLinkReverse1Complete.Reverse(ref toReverse, endReverse: new LinkedListSingleLinkNode <int>());
            }
            catch (ArgumentException)
            {
                Assert.IsTrue(true);
                return;
            }
            Assert.Fail();
        }
        public void LinkedListSingleLinkSplit2FastSlowCompleteTestSingleElement()
        {
            // First list.
            var toSplit = LinkedListSingleLinkNode <int> .CreateFromData(3);

            // Expected A (1st half of list)
            var expectedDropped = LinkedListSingleLinkNode <int> .CreateFromData(3);

            // Split the list.
            LinkedListSingleLinkSplit2FastSlowComplete.Split(toSplit, out LinkedListSingleLinkNode <int> ResultA, out LinkedListSingleLinkNode <int> ResultB, out LinkedListSingleLinkNode <int> ResultDropped);

            // Do the compare.
            Assert.IsTrue(LinkedListSingleLinkNode <int> .Compare(ResultA, null));
            Assert.IsTrue(LinkedListSingleLinkNode <int> .Compare(ResultB, null));
            Assert.IsTrue(LinkedListSingleLinkNode <int> .Compare(ResultDropped, expectedDropped));
        }
예제 #22
0
        /// <summary>
        /// Partitions a list around a specified value in place.
        /// </summary>
        /// <param name="head">The head of the list.</param>
        /// <param name="x">The value to partition around.</param>
        public static void Partition(ref LinkedListSingleLinkNode <int> head, int x)
        {
            // Use dummy nodes to simply code.
            var beforeTop    = new LinkedListSingleLinkNode <int>(-1);
            var beforeBottom = beforeTop;
            var afterTop     = new LinkedListSingleLinkNode <int>(-1);
            var afterBottom  = afterTop;

            var curr = head;

            while (curr != null)
            {
                // Store next & null out to prevent cycles.
                var next = curr.Next;
                curr.Next = null;

                // Add to appropriate list.
                if (curr.Value < x)
                {
                    // Update next pointer & bottom.
                    beforeBottom.Next = curr;
                    beforeBottom      = curr;
                }
                else
                {
                    // Update next pointer & bottom.
                    afterBottom.Next = curr;
                    afterBottom      = curr;
                }

                // Go to next.
                curr = next;
            }

            // Special case, if no before list, just use after list.
            // (Use .Next due to dummy node).
            if (beforeTop.Next == null)
            {
                head = afterTop.Next;
                return;
            }

            // Update head & attach the after list to the before list.
            // (Use .Next due to dummy node).
            head = beforeTop.Next;
            beforeBottom.Next = afterTop.Next;
        }
        /// <summary>
        /// Partitions a list around a specified value in place.
        /// </summary>
        /// <param name="head">The head of the list.</param>
        /// <param name="x">The value to partition around.</param>
        public static void Partition(ref LinkedListSingleLinkNode <int> head, int x)
        {
            // Initialize new list links.
            LinkedListSingleLinkNode <int> headNew = null;
            LinkedListSingleLinkNode <int> tailNew = null;

            var curr = head;

            while (curr != null)
            {
                // Store next & null out to prevent cycles.
                var next = curr.Next;
                curr.Next = null;

                // Update new list initially.
                if (headNew == null)
                {
                    headNew = curr;
                    tailNew = curr;
                }
                else
                {
                    // Add to head.
                    if (curr.Value < x)
                    {
                        curr.Next = headNew;
                        headNew   = curr;
                    }
                    // Add to tail.
                    else
                    {
                        tailNew.Next = curr;
                        tailNew      = curr;
                    }
                }

                // Go to next.
                curr = next;
            }

            // Update head.
            head = headNew;
        }
        public void LinkedListSingleLinkSplit2FastSlowCompleteTestSimpleEven()
        {
            // First list.
            var a = LinkedListSingleLinkNode <int> .CreateFromData(1, 2, 3, 4);

            // Expected A (1st half of list)
            var expectedA = LinkedListSingleLinkNode <int> .CreateFromData(1, 2);

            // Expected B (2nd half of list)
            var expectedB = LinkedListSingleLinkNode <int> .CreateFromData(3, 4);

            // Split the list.
            LinkedListSingleLinkSplit2FastSlowComplete.Split(a, out LinkedListSingleLinkNode <int> ResultA, out LinkedListSingleLinkNode <int> ResultB, out LinkedListSingleLinkNode <int> ResultDropped);

            // Do the compare.
            Assert.IsTrue(LinkedListSingleLinkNode <int> .Compare(ResultA, expectedA));
            Assert.IsTrue(LinkedListSingleLinkNode <int> .Compare(ResultB, expectedB));
            Assert.IsTrue(LinkedListSingleLinkNode <int> .Compare(ResultDropped, null));
        }
예제 #25
0
        public void LinkedListSingleLinkSplit1BruteForceCompleteTestSimpleOdd()
        {
            // First list.
            var a = LinkedListSingleLinkNode <int> .CreateFromData(1, 2, 3);

            // Expected A (1st half of list)
            var expectedA = LinkedListSingleLinkNode <int> .CreateFromData(1);

            // Expected B (2nd half of list)
            var expectedB = LinkedListSingleLinkNode <int> .CreateFromData(3);

            // Expected dropped.
            var expectedDropped = LinkedListSingleLinkNode <int> .CreateFromData(2);

            // Split the list.
            LinkedListSingleLinkSplit1BruteForceComplete.Split(a, out LinkedListSingleLinkNode <int> ResultA, out LinkedListSingleLinkNode <int> ResultB, out LinkedListSingleLinkNode <int> ResultDropped);

            // Do the compare.
            Assert.IsTrue(LinkedListSingleLinkNode <int> .Compare(ResultA, expectedA));
            Assert.IsTrue(LinkedListSingleLinkNode <int> .Compare(ResultB, expectedB));
            Assert.IsTrue(LinkedListSingleLinkNode <int> .Compare(ResultDropped, expectedDropped));
        }
예제 #26
0
        /// <summary>
        /// Reverse the list.
        /// </summary>
        /// <param name="top">The top of the list.</param>
        private static void ReverseHelper(ref LinkedListSingleLinkNode <int> top)
        {
            // Initialize starting vars.
            LinkedListSingleLinkNode <int> prev = null;
            var curr = top;

            // Go through list.
            while (curr != null)
            {
                // Store next.
                var next = curr.Next;

                // Update
                curr.Next = prev;
                prev      = curr;

                // Go to next.
                curr = next;

                // Update top.
                top = prev;
            }
        }
        /// <summary>
        /// Removes duplicate nodes from the list.
        /// </summary>
        /// <param name="head">A ref to the head node in the list.</param>
        public static void RemoveDuplicates(LinkedListSingleLinkNode <int> head)
        {
            // Initialize ref to node being checked.
            var currToCheck = head;

            // Check all nodes.
            while (currToCheck != null)
            {
                // Initialize refs to nodes being
                // checked against current node.
                // Skip the node we are checking.
                var prev = currToCheck;
                var curr = currToCheck.Next;

                // If there is a node to check, check it.
                while (curr != null)
                {
                    // If the nodes values match, remove the
                    // node.
                    if (curr.Value == currToCheck.Value)
                    {
                        prev.Next = curr.Next;
                    }
                    // Otherwise just go to next.
                    else
                    {
                        prev = curr;
                    }

                    // Go to next.
                    curr = curr.Next;
                }

                // Go to next node to check.
                currToCheck = currToCheck.Next;
            }
        }
        /// <summary>
        /// Removes duplicate nodes from the list.
        /// </summary>
        /// <param name="head">A ref to the head node in the list.</param>
        public static void RemoveDuplicates(LinkedListSingleLinkNode <int> head)
        {
            // Initialize hash set.
            var values = new HashSet <int>();

            // Initialize initial values.
            LinkedListSingleLinkNode <int> prev = null;
            var curr = head;

            // Check each node.
            while (curr != null)
            {
                // Check if node is already there.
                if (values.Contains(curr.Value))
                {
                    // Delete this node.
                    // Note: previous can't be null for this algorithm
                    // since the first node cannot be a duplicate, but
                    // check to prevent ReSharper warning.
                    if (prev != null)
                    {
                        prev.Next = curr.Next;
                    }
                }
                else
                {
                    // Add new node.
                    values.Add(curr.Value);

                    // Note: Don't update previous in the delete case.
                    prev = curr;
                }

                // Go to next.
                curr = curr.Next;
            }
        }
예제 #29
0
        /// <summary>
        /// Split 'toSplit' the lists using the fast-pointer slow pointer method.
        /// If the list has an uneven number of elements remove the 'middle'
        /// element and return it in dropped.
        /// </summary>
        /// <param name="toSplit">The list to split.</param>
        /// <param name="resultA">The first half of the list.</param>
        /// <param name="resultB">The second half of the list.</param>
        /// <param name="dropped">The 'middle' element (null for even number of elements).</param>
        public static void Split(LinkedListSingleLinkNode <int> toSplit, out LinkedListSingleLinkNode <int> resultA, out LinkedListSingleLinkNode <int> resultB, out LinkedListSingleLinkNode <int> dropped)
        {
            // Start at toSplit.
            resultA = toSplit;
            resultB = toSplit;

            // dropped is null by default.
            dropped = null;

            // End is fast pointer.
            var end = toSplit;

            // Set previous.
            LinkedListSingleLinkNode <int> prev  = null;
            LinkedListSingleLinkNode <int> prev2 = null;

            // Strategy:  End is fast pointer, move to end.
            while (end != null)
            {
                // Move to next.
                prev2   = prev;
                prev    = resultB;
                resultB = resultB.Next;
                end     = end.Next;

                // Double move 'End'.
                if (end != null)
                {
                    end = end.Next;
                }
                // End of uneven list case.
                else
                {
                    dropped = prev;
                }
            }

            // At this point resultA, resultB and dropped are set correctly
            // so we just need to do some additional cleanup.

            // For odd case, null prev2.
            if (dropped != null)
            {
                // Isolate the dropped element.
                dropped.Next = null;

                // For odd count prev2 points to the end of the first half of
                // the list so we need to null the next pointer.
                if (prev2 != null)
                {
                    prev2.Next = null;
                }
                // If no prev2 is null we have a single element list so just null resultA.
                else
                {
                    resultA = null;
                }
            }
            // For even case, null previous.
            else
            {
                // For even count prev points to the end of the first half of
                // the list so we need to null the next pointer.
                // Note: prev is null for empty list.
                if (prev != null)
                {
                    prev.Next = null;
                }
            }
        }
        public void LinkedListSingleLinkFindIntersection1BruteForceCompleteTest1IntersectionFound()
        {
            // Note that since we need intersecting nodes, we can't use our helpers
            // to construct these lists.

            // Construct:
            // 11 -> 12 -> 13 -> (Common) 101 -> (Common) 102
            // 21 -> 22 -> 23 -> 24 ->  (Common) 101 -> (Common) 102

            // Initialize first list.
            var third1 = new LinkedListSingleLinkNode <int>
            {
                Value = 13
            };

            var second1 = new LinkedListSingleLinkNode <int>
            {
                Next  = third1,
                Value = 12
            };

            var first1 = new LinkedListSingleLinkNode <int>
            {
                Next  = second1,
                Value = 11
            };

            // Initialize second list.
            var fourth2 = new LinkedListSingleLinkNode <int>
            {
                Value = 24
            };

            var third2 = new LinkedListSingleLinkNode <int>
            {
                Next  = fourth2,
                Value = 23
            };

            var second2 = new LinkedListSingleLinkNode <int>
            {
                Next  = third2,
                Value = 22
            };

            var first2 = new LinkedListSingleLinkNode <int>
            {
                Next  = second2,
                Value = 21
            };

            // Initialize common nodes.
            var common1 = new LinkedListSingleLinkNode <int>
            {
                Value = 101
            };

            fourth2.Next = common1;
            third1.Next  = common1;

            var common2 = new LinkedListSingleLinkNode <int>
            {
                Value = 102
            };

            common1.Next = common2;

            // Do check.
            Assert.AreEqual(common1, LinkedListSingleLinkFindIntersection1BruteForceComplete.FindIntersection(first1, first2));
        }