private SinglyLinkList ReverseLinkedList(SinglyLinkList singly)
        {
            log("Reversing linked list", true);
            SNode curr = singly.head, prev = null, next = null;

            while (curr.data != -1)
            {
                next      = curr.next;
                curr.next = prev;
                prev      = curr;
                curr      = next;
            }

            singly.head = prev;

            return(singly);
        }
        public SNode ReverseGroupedLinkedList(SinglyLinkList singly, int m, int n)
        {
            SNode ll_head = singly.head, temp = singly.head, dummy_node = null, prev = null;

            SNode curr = null, rprev = null, rtemp = null;

            int count = 1;

            log("Real List");
            PrintLinkList(singly);
            log("");

            while (temp != null && count != m)
            {
                prev = temp;
                temp = temp.next;
                count++;
            }

            log("temp ==> ", false);
            log(temp.data.ToString());

            prev.next  = dummy_node;
            dummy_node = temp;

            rprev = dummy_node;
            curr  = temp;

            while (curr != null && count != n)
            {
                rtemp     = curr.next;
                curr.next = rprev;
                rprev     = curr;
                curr      = rtemp;
            }

            prev.next = rprev;

            ll_head = prev;

            return(ll_head);
        }
        public void PrintLinkList(SinglyLinkList singly)
        {
            log("printing linked list", true);
            SNode temp = singly.head;

            while (temp != null)
            {
                if (temp.next == null)
                {
                    log(temp.data.ToString(), false);
                }
                else
                {
                    log(temp.data.ToString() + "-> ", false);
                }

                temp = temp.next;
            }
            log("", true);
            log("==================", true);
        }
        public SNode AddTwoLinkedList(SinglyLinkList singly_first, SinglyLinkList singly_second)
        {
            log("Adding Linked List", true);

            SNode first, second, res = null, prev = null, temp = null;
            int   carry = 0, sum;

            first  = singly_first.head;
            second = singly_second.head;

            while (first != null || second != null)
            {
                int num_first = 0, num_second = 0;

                if (first != null)
                {
                    num_first = first.data;
                }
                if (second != null)
                {
                    num_second = second.data;
                }

                sum = carry + num_first + num_second;

                if (sum >= 10)
                {
                    carry = 1;
                }
                else
                {
                    carry = 0;
                }

                sum = sum % 10;

                temp = new SNode(sum);

                if (res == null)
                {
                    res = temp;
                }
                else
                {
                    prev.next = temp;
                }

                prev = temp;

                if (first != null)
                {
                    first = first.next;
                }
                if (second != null)
                {
                    second = second.next;
                }
            }

            if (carry > 0)
            {
                temp.next = new SNode(carry);
            }

            PrintNode(res);
            return(res);
        }