public static Node <int> GetNodeBasedOnPosition(CustomLinkedList <int> linkedList, int position)
        {
            if (linkedList == null || linkedList.Head == null)
            {
                return(new Node <int>());
            }

            var current = linkedList.Head;

            for (int i = 0; i < position; i++)
            {
                current = current.Next;
            }

            if (current == null)
            {
                return(new Node <int>());
            }

            var positionNode = linkedList.Head;

            while (current != null)
            {
                current      = current.Next;
                positionNode = positionNode.Next;
            }


            return(positionNode);
        }
示例#2
0
        public static CustomLinkedList <int> Remove(CustomLinkedList <int> linkedList, int key)
        {
            if (linkedList == null || linkedList.Head == null)
            {
                return(linkedList);
            }

            var current = linkedList.Head;

            while (current != null && current.Value == key)
            {
                current = current.Next;
            }
            var previous = current;

            current = current.Next;

            while (current != null)
            {
                if (current.Value == key)
                {
                    previous.Next = current.Next;
                }
                else
                {
                    previous = current;
                }
                current = current.Next;
            }

            return(linkedList);
        }
示例#3
0
        public static CustomLinkedList <int> RemoveDuplicate(CustomLinkedList <int> linkedList)
        {
            if (linkedList == null || linkedList.Head == null || linkedList.Head.Next == null)
            {
                return(linkedList);
            }

            HashSet <int> set      = new HashSet <int>();
            var           previous = linkedList.Head;

            set.Add(previous.Value);

            var current = linkedList.Head.Next;

            while (current != null)
            {
                if (set.Contains(current.Value))
                {
                    previous.Next = current.Next;
                }
                else
                {
                    set.Add(current.Value);
                    previous = current;
                }
                current = current.Next;
            }

            return(linkedList);
        }
示例#4
0
        public static CustomLinkedList <int> SwapBasedOnPosition(CustomLinkedList <int> linkedList, int position)
        {
            if (linkedList == null || linkedList.Head == null)
            {
                return(linkedList);
            }

            var current = linkedList.Head;

            for (int i = 0; i < position; i++)
            {
                current = current.Next;
            }

            if (current == null)
            {
                return(linkedList);
            }

            var positionNode = linkedList.Head;

            while (current != null)
            {
                current      = current.Next;
                positionNode = positionNode.Next;
            }

            var temp = positionNode.Value;

            positionNode.Value    = linkedList.Head.Value;
            linkedList.Head.Value = temp;

            return(linkedList);
        }
        public static CustomLinkedList <int> GetMergedList(CustomLinkedList <int> linkedList1, CustomLinkedList <int> linkedList2)
        {
            CustomLinkedList <int> result = new CustomLinkedList <int>();

            if (linkedList1 == null)
            {
                return(linkedList2);
            }
            if (linkedList2 == null)
            {
                return(linkedList1);
            }
            var linkedList1Head = linkedList1.Head;
            var linkedList2Head = linkedList2.Head;

            while (linkedList1Head != null && linkedList2Head != null)
            {
                if (linkedList1Head.Value > linkedList2Head.Value)
                {
                    result.AddLast(linkedList2Head.Value);
                    linkedList2Head = linkedList2Head.Next;
                }
                else
                {
                    result.AddLast(linkedList1Head.Value);
                    linkedList1Head = linkedList1Head.Next;
                }
            }

            if (linkedList1Head != null)
            {
                while (linkedList1Head != null)
                {
                    result.AddLast(linkedList1Head.Value);
                    linkedList1Head = linkedList1Head.Next;
                }
            }


            if (linkedList2Head != null)
            {
                while (linkedList2Head != null)
                {
                    result.AddLast(linkedList2Head.Value);
                    linkedList2Head = linkedList2Head.Next;
                }
            }


            return(result);
        }
示例#6
0
        public static Node <int> GetIntersectionNode(CustomLinkedList <int> linkedList1, CustomLinkedList <int> linkedList2)
        {
            if (linkedList1 == null || linkedList2 == null)
            {
                return(null);
            }


            CustomLinkedList <int> shortLinkedList;
            CustomLinkedList <int> longLinkedList;

            if (linkedList1.GetLength() > linkedList2.GetLength())
            {
                shortLinkedList = linkedList2;
                longLinkedList  = linkedList1;
            }
            else
            {
                shortLinkedList = linkedList1;
                longLinkedList  = linkedList2;
            }

            Node <int> shortLinkedListHead = shortLinkedList.Head;
            Node <int> longLinkedListHead  = longLinkedList.Head;

            for (int i = 0; i < longLinkedList.GetLength() - shortLinkedList.GetLength(); i++)
            {
                longLinkedListHead = longLinkedListHead.Next;
            }

            while (shortLinkedListHead.Next != null)
            {
                if (shortLinkedListHead.Equals(longLinkedListHead))
                {
                    return(shortLinkedListHead);
                }
                shortLinkedListHead = shortLinkedListHead.Next;
                longLinkedListHead  = longLinkedListHead.Next;
            }

            return(null);
        }
        public static Node <int> Reverse(CustomLinkedList <int> linkedList)
        {
            if (linkedList == null || linkedList.Head == null)
            {
                return(null);
            }

            Node <int> previous = linkedList.Head;
            Node <int> current  = linkedList.Head.Next;

            previous.Next = null;

            while (current != null)
            {
                var temp = current;
                current   = current.Next;
                temp.Next = previous;
                previous  = temp;
            }

            return(previous);
        }
示例#8
0
        public static void LinkedListProblems()
        {
            // Linked List

            // Reverse a linked list
            LinkedList <int> linked = new LinkedList <int>();

            linked.AddLast(1);
            linked.AddLast(2);
            linked.AddLast(3);
            LinkedList <int> linked2 = new LinkedList <int>();

            linked2.AddLast(1);
            linked2.AddLast(2);
            linked2.AddLast(3);

            PrintHelpers.PrintArray("Reverse Linked List", linked2.ToArray(), ReverseLinkedList.Reverse(linked).ToArray());

            var customLinked = new CustomLinkedList <int>();

            customLinked.Head = new Node <int> {
                Value = 1
            };
            customLinked.Head.Next = new Node <int> {
                Value = 2
            };
            customLinked.Head.Next.Next = new Node <int> {
                Value = 2
            };
            customLinked.Head.Next.Next.Next = new Node <int> {
                Value = 3
            };
            var customLinked2 = new CustomLinkedList <int>();

            customLinked2.Head = new Node <int> {
                Value = 1
            };
            customLinked2.Head.Next = new Node <int> {
                Value = 2
            };
            customLinked2.Head.Next.Next = new Node <int> {
                Value = 2
            };
            customLinked2.Head.Next.Next.Next = new Node <int> {
                Value = 3
            };

            PrintHelpers.PrintArray("Reverse a Custom Linked List", customLinked2, new CustomLinkedList <int>
            {
                Head = ReverseLinkedList.Reverse(customLinked)
            });

            // Remove duplicates in a linked list
            linked = new LinkedList <int>();
            linked.AddLast(1);
            linked.AddLast(2);
            linked.AddLast(2);
            linked.AddLast(3);
            linked2 = new LinkedList <int>();
            linked2.AddLast(1);
            linked2.AddLast(2);
            linked2.AddLast(2);
            linked2.AddLast(3);
            PrintHelpers.PrintArray("Remove Duplicates", linked2.ToArray(), RemoveDuplicates.RemoveDuplicate(linked).ToArray());

            // Remove duplicates in a Custom linked list
            customLinked      = new CustomLinkedList <int>();
            customLinked.Head = new Node <int> {
                Value = 1
            };
            customLinked.Head.Next = new Node <int> {
                Value = 2
            };
            customLinked.Head.Next.Next = new Node <int> {
                Value = 2
            };
            customLinked.Head.Next.Next.Next = new Node <int> {
                Value = 3
            };
            customLinked2      = new CustomLinkedList <int>();
            customLinked2.Head = new Node <int> {
                Value = 1
            };
            customLinked2.Head.Next = new Node <int> {
                Value = 2
            };
            customLinked2.Head.Next.Next = new Node <int> {
                Value = 2
            };
            customLinked2.Head.Next.Next.Next = new Node <int> {
                Value = 3
            };
            PrintHelpers.PrintArray("Remove Duplicates Custom Linked List", customLinked2, RemoveDuplicates.RemoveDuplicate(customLinked));


            // Remove Node with given key in a linked list
            PrintHelpers.PrintArray("Remove Node with given key ", linked2.ToArray(), RemoveNodeWithGivenKey.Remove(linked, 2).ToArray());

            // Remove Node with given key in a Custom linked list
            PrintHelpers.PrintArray("Remove Node with given key  Custom Linked List", customLinked2, RemoveNodeWithGivenKey.Remove(customLinked, 2));


            linked = new LinkedList <int>();
            linked.AddLast(1);
            linked.AddLast(2);
            linked.AddLast(2);
            linked.AddLast(3);
            linked2 = new LinkedList <int>();
            linked2.AddLast(1);
            linked2.AddLast(2);
            linked2.AddLast(2);
            linked2.AddLast(3);

            customLinked      = new CustomLinkedList <int>();
            customLinked.Head = new Node <int> {
                Value = 1
            };
            customLinked.Head.Next = new Node <int> {
                Value = 2
            };
            customLinked.Head.Next.Next = new Node <int> {
                Value = 2
            };
            customLinked.Head.Next.Next.Next = new Node <int> {
                Value = 3
            };
            customLinked2      = new CustomLinkedList <int>();
            customLinked2.Head = new Node <int> {
                Value = 1
            };
            customLinked2.Head.Next = new Node <int> {
                Value = 2
            };
            customLinked2.Head.Next.Next = new Node <int> {
                Value = 2
            };
            customLinked2.Head.Next.Next.Next = new Node <int> {
                Value = 3
            };
            // N from last Node in a linked list
            PrintHelpers.PrintArray("N from last Node in a linked list", linked2.ToArray(), new LinkedList <int>(new[] { NFromLastNode.GetNodeBasedOnPosition(linked, 2).Value }).ToArray(), "Node: 2");

            // N from last Node in a Custom linked list
            PrintHelpers.PrintArray("N from last Node in a custom linked list", customLinked2, new CustomLinkedList <int>
            {
                Head = new Node <int> {
                    Value = NFromLastNode.GetNodeBasedOnPosition(customLinked, 2).Value
                }
            }, "Node: 2");

            // Swap N Node with Head
            PrintHelpers.PrintArray("Swap N Node with Head", linked2.ToArray(), SwapNnodeWithHead.SwapBasedOnPosition(linked, 2).ToArray(), "Node: 2");
            PrintHelpers.PrintArray("Swap N Node with Head", customLinked2, SwapNnodeWithHead.SwapBasedOnPosition(customLinked, 2), "Node: 2");


            // Intersection Point of 2 Linked list
            //LinkedListNode<int> node = new LinkedListNode<int>(5);
            //linked = new LinkedList<int>();
            //linked.AddLast(1);
            //linked.AddLast(2);
            //linked.AddLast(2);
            //linked.AddLast(node);
            //linked.AddLast(3);
            //linked2 = new LinkedList<int>();
            //linked2.AddLast(1);
            //linked2.AddLast(2);
            //linked2.AddLast(2);
            //linked2.AddLast(node);
            //linked2.AddLast(3);
            var node = new Node <int> {
                Value = 5
            };

            customLinked      = new CustomLinkedList <int>();
            customLinked.Head = new Node <int> {
                Value = 1
            };
            customLinked.Head.Next = new Node <int> {
                Value = 2
            };
            customLinked.Head.Next.Next = new Node <int> {
                Value = 2
            };
            customLinked.Head.Next.Next.Next      = node;
            customLinked.Head.Next.Next.Next.Next = new Node <int> {
                Value = 3
            };
            customLinked2      = new CustomLinkedList <int>();
            customLinked2.Head = new Node <int> {
                Value = 7
            };
            customLinked2.Head.Next = new Node <int> {
                Value = 8
            };
            customLinked2.Head.Next.Next = new Node <int> {
                Value = 9
            };
            customLinked2.Head.Next.Next.Next      = node;
            customLinked2.Head.Next.Next.Next.Next = new Node <int> {
                Value = 3
            };

            PrintHelpers.PrintArray("Intersection Point of 2 Linked list in Custom Linked List", new[] { customLinked, customLinked2 },
                                    new CustomLinkedList <int>
            {
                Head = new Node <int> {
                    Value = IntersectionPointOfTwoLists.GetIntersectionNode(customLinked, customLinked2).Value
                }
            });


            //Merge two Sorted Arrays
            linked = new LinkedList <int>();
            linked.AddLast(1);
            linked.AddLast(4);
            linked.AddLast(8);
            linked.AddLast(11);
            linked2 = new LinkedList <int>();
            linked2.AddLast(2);
            linked2.AddLast(4);
            linked2.AddLast(5);
            linked2.AddLast(9);
            PrintHelpers.PrintArray("Merge Two Sorted Arrays", new [] { linked.ToArray(), linked2.ToArray() }, MergeTwoSortedLinkedList.GetMergedList(linked, linked2).ToArray());

            customLinked      = new CustomLinkedList <int>();
            customLinked.Head = new Node <int> {
                Value = 1
            };
            customLinked.Head.Next = new Node <int> {
                Value = 4
            };
            customLinked.Head.Next.Next = new Node <int> {
                Value = 8
            };
            customLinked.Head.Next.Next.Next = new Node <int> {
                Value = 11
            };
            customLinked2      = new CustomLinkedList <int>();
            customLinked2.Head = new Node <int> {
                Value = 2
            };
            customLinked2.Head.Next = new Node <int> {
                Value = 4
            };
            customLinked2.Head.Next.Next = new Node <int> {
                Value = 5
            };
            customLinked2.Head.Next.Next.Next = new Node <int> {
                Value = 9
            };
            PrintHelpers.PrintArray("Merge Two Sorted Arrays in Custom Linked List", new [] { customLinked, customLinked2 }, MergeTwoSortedLinkedList.GetMergedList(customLinked, customLinked2));

            // Rotata a linked list
            customLinked      = new CustomLinkedList <int>();
            customLinked.Head = new Node <int> {
                Value = 1
            };
            customLinked.Head.Next = new Node <int> {
                Value = 2
            };
            customLinked.Head.Next.Next = new Node <int> {
                Value = 3
            };
            customLinked.Head.Next.Next.Next = new Node <int> {
                Value = 4
            };
            customLinked2      = new CustomLinkedList <int>();
            customLinked2.Head = new Node <int> {
                Value = 1
            };
            customLinked2.Head.Next = new Node <int> {
                Value = 2
            };
            customLinked2.Head.Next.Next = new Node <int> {
                Value = 3
            };
            customLinked2.Head.Next.Next.Next = new Node <int> {
                Value = 4
            };
            PrintHelpers.PrintArray("Rotate in Custom Linked List", customLinked2, RotateLinkedList.Rotate(customLinked, 2));
        }