Example #1
0
        public void ReverseInPlace(ref SNode node, int k)
        {
            var headToResult = new SNode();
            var prev         = headToResult;

            var visitor = node;

            while (visitor != null)
            {
                var head = visitor;
                int i    = 0;
                while (i < k - 1 && visitor != null)
                {
                    visitor = visitor.Next;
                    i++;
                }

                var tail = visitor;
                if (visitor != null)
                {
                    visitor   = visitor.Next;
                    tail.Next = null;
                }

                head      = new ReverseSingleLinkedList().Reverse(head);
                prev.Next = head;
                prev      = FindTail(head);
            }

            node = headToResult.Next;
        }
Example #2
0
        public SNode Zip(SNode list)
        {
            var fast = list;
            var slow = list;

            while (slow != null && fast != null && fast.Next != null)
            {
                slow = slow.Next;
                fast = fast.Next.Next;
            }

            var head1 = list;
            var head2 = slow.Next;

            slow.Next = null;             // split lists

            head2 = new ReverseSingleLinkedList().Reverse(head2);

            // Merge head1 and head2
            var it1 = head1;
            var it2 = head2;

            bool useLeft = true;

            SNode result = new SNode();
            SNode tail   = new SNode();

            while (it1 != null && it2 != null)
            {
                var nodeToAdd = useLeft ? new SNode(it1.Value) : new SNode(it2.Value);

                if (result.Next == null)
                {
                    result.Next = nodeToAdd;
                    tail.Next   = result.Next;
                }
                else
                {
                    AddToTail(ref tail, nodeToAdd);
                }

                if (useLeft)
                {
                    it1 = it1.Next;
                }
                else
                {
                    it2 = it2.Next;
                }

                useLeft = !useLeft;
            }

            AddRemainingItems(ref tail, it1);
            AddRemainingItems(ref tail, it2);

            return(result.Next);
        }
Example #3
0
        public void Reverse(ref SNode node, int k)
        {
            var splitLists = new List <SNode>();
            var nodeCount  = CountNodes(node);

            int finalListCount = (int)Math.Ceiling((decimal)nodeCount / k);
            int i = 0;

            SNode nextList = node;

            while (i < finalListCount)
            {
                SNode head = nextList;
                SNode it   = head;

                int m = 0;
                while (m < k - 1 && it != null)
                {
                    it = it.Next;
                    m++;
                }

                if (it != null)
                {
                    nextList = it.Next;
                    it.Next  = null;
                }

                splitLists.Add(head);
                i++;
            }

            var reversedLists = new List <SNode>();

            foreach (var list in splitLists)
            {
                var rlist = new ReverseSingleLinkedList().Reverse(list);
                reversedLists.Add(rlist);
            }

            node = Merge(reversedLists);
        }