public ListNode DeleteDuplicates(ListNode head)
        {
            if (head == null || head.next == null)
                return head;

            ListNode newHead = new ListNode(-1);
            newHead.next = head;

            ListNode prev = newHead;
            ListNode current = head;
            while (current != null)
            {
                if (current.next != null && current.next.val == current.val)
                {
                    while (current.next != null && current.next.val == current.val)
                        current = current.next;

                    prev.next = current.next;
                    current = current.next;
                }
                else
                {
                    prev = prev.next;
                    current = current.next;
                }

            }
            return newHead.next;
        }
Exemplo n.º 2
0
        public ListNode Partition(ListNode head, int x)
        {
            if (head == null)
                return null;

            ListNode sm = new ListNode(0);
            ListNode sm_tail = sm;
            ListNode gt = new ListNode(0);
            ListNode gt_tail = gt;

            ListNode curr = head;
            while (curr != null)
            {
                if (curr.val < x)
                {
                    sm_tail.next = curr;
                    curr = curr.next;
                    sm_tail = sm_tail.next;
                    sm_tail.next = null;
                }
                else
                {
                    gt_tail.next = curr;
                    curr = curr.next;
                    gt_tail = gt_tail.next;
                    gt_tail.next = null;
                }
            }

            sm_tail.next = gt.next;
            return sm.next;
        }
 public void OJ019_RemoveNthNodeFromEndOfListTest3()
 {
     ListNode l1 = new ListNode(1);
     l1.next = new ListNode(2);
     ListNode result = new OJ019_RemoveNthNodeFromEndOfList().RemoveNthFromEnd(l1, 2);
     Assert.AreEqual(2, result.val);
 }
Exemplo n.º 4
0
        public ListNode RotateRight(ListNode head, int k)
        {
            if (head == null || k == 0)
                return head;

            ListNode current = head;
            int count = 0;
            while (current != null)
            {
                count++;
                current = current.next;
            }

            k = k % count;
            if (k == 0)
                return head;

            ListNode first = head;
            while (k-- > 0)
                first = first.next;

            ListNode second = head;
            while (first.next != null)
            {
                first = first.next;
                second = second.next;
            }

            ListNode result = second.next;
            first.next = head;
            second.next = null;
            return result;
        }
        public ListNode ReverseBetween(ListNode head, int m, int n)
        {
            if (head == null)
                return null;

            ListNode prev = null;
            ListNode current = head;
            ListNode next = null;

            int i = 0;
            for (; i < m - 1; i++)
            {
                prev = current;
                current = current.next;
            }

            ListNode h = prev;
            ListNode hn = current;
            for (; i < n && current != null; i++)
            {
                next = current.next;
                current.next = prev;

                prev = current;
                current = next;
            }

            if (h != null)
                h.next = prev;
            else
                head = prev;
            hn.next = current;

            return head;
        }
Exemplo n.º 6
0
        public ListNode AddTwoNumbers(ListNode l1, ListNode l2)
        {
            ListNode result = new ListNode(0);
            ListNode current = result;
            while (true)
            {
                int sum = current.val;
                if (l1 != null)
                {
                    sum += l1.val;
                    l1 = l1.next;
                }
                if (l2 != null)
                {
                    sum += l2.val;
                    l2 = l2.next;
                }

                current.val = sum % 10;
                sum = sum / 10;

                if (l1 != null || l2 != null || sum != 0)
                {
                    current.next = new ListNode(sum);
                    current = current.next;
                }
                else
                    break;
            }
            return result;
        }
        public ListNode SwapPairs(ListNode head)
        {
            if (head == null || head.next == null)
                return head;

            ListNode first = head;
            ListNode second = head.next;
            head = second;
            ListNode prev = null;
            while (first != null && second != null)
            {
                first.next = second.next;
                second.next = first;

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

                first = first.next;
                if (first != null)
                    second = first.next;
            }
            return head;
        }
 public void OJ083_RemoveDuplicatesFromSortedListTest3()
 {
     ListNode ln = new ListNode(1);
     ln.Next(1).Next(1);
     ListNode result = new OJ083_RemoveDuplicatesFromSortedList().DeleteDuplicates(ln);
     Assert.AreEqual(1, ln.val);
     Assert.AreEqual(null, ln.next);
 }
        public void OJ024_SwapNodesInPairsTest2()
        {
            ListNode l1 = new ListNode(1);
            l1.next = new ListNode(2);

            ListNode result = new OJ024_SwapNodesInPairs().SwapPairs(l1);
            Assert.AreEqual(2, result.val);
            Assert.AreEqual(1, result.next.val);
        }
 public void OJ082_RemoveDuplicatesFromSortedListIITest2()
 {
     ListNode ln = new ListNode(1);
     ln.Next(1).Next(1).Next(2).Next(3);
     ListNode result = new OJ082_RemoveDuplicatesFromSortedListII().DeleteDuplicates(ln);
     Assert.AreEqual(2, result.val);
     Assert.AreEqual(3, result.next.val);
     Assert.AreEqual(null, result.next.next);
 }
        public void OJ109_ConvertSortedListToBinarySearchTreeTest1()
        {
            ListNode n = new ListNode(1);
            n.Next(2).Next(3).Next(4).Next(5).Next(6);
            TreeNode result = new OJ109_ConvertSortedListToBinarySearchTree().SortedListToBST(n);

            Assert.AreEqual(3, result.val);
            Assert.AreEqual(1, result.left.val);
            Assert.AreEqual(2, result.left.right.val);
            Assert.AreEqual(5, result.right.val);
            Assert.AreEqual(4, result.right.left.val);
            Assert.AreEqual(6, result.right.right.val);
        }
        public void OJ086_PartitionListTest1()
        {
            ListNode ln = new ListNode(1);
            ln.Next(4).Next(3).Next(2).Next(5).Next(2);
            ListNode result = new OJ086_PartitionList().Partition(ln, 3);

            Assert.AreEqual(1, result.val);
            Assert.AreEqual(2, result.next.val);
            Assert.AreEqual(2, result.next.next.val);
            Assert.AreEqual(4, result.next.next.next.val);
            Assert.AreEqual(3, result.next.next.next.next.val);
            Assert.AreEqual(5, result.next.next.next.next.next.val);
            Assert.AreEqual(null, result.next.next.next.next.next.next);
        }
        public ListNode ReverseList(ListNode head)
        {
            ListNode prev = null;
            ListNode current = head;
            ListNode next = null;
            while (current != null)
            {
                next = current.next;
                current.next = prev;

                prev = current;
                current = next;
            }
            return prev;
        }
        public void OJ025_ReverseNodesInKGroup2()
        {
            ListNode l1 = new ListNode(1);
            l1.next = new ListNode(2);
            l1.next.next = new ListNode(3);
            l1.next.next.next = new ListNode(4);
            l1.next.next.next.next = new ListNode(5);

            ListNode result = new OJ025_ReverseNodesInKGroup().ReverseKGroup(l1, 3);
            Assert.AreEqual(3, result.val);
            Assert.AreEqual(2, result.next.val);
            Assert.AreEqual(1, result.next.next.val);
            Assert.AreEqual(4, result.next.next.next.val);
            Assert.AreEqual(5, result.next.next.next.next.val);
            Assert.AreEqual(null, result.next.next.next.next.next);
        }
        public void OJ206_ReverseLinkedListTest1()
        {
            ListNode l1 = new ListNode(1);
            l1.next = new ListNode(2);
            l1.next.next = new ListNode(3);
            l1.next.next.next = new ListNode(4);
            l1.next.next.next.next = new ListNode(5);

            ListNode result = new OJ206_ReverseLinkedList().ReverseList(l1);
            Assert.AreEqual(5, result.val);
            Assert.AreEqual(4, result.next.val);
            Assert.AreEqual(3, result.next.next.val);
            Assert.AreEqual(2, result.next.next.next.val);
            Assert.AreEqual(1, result.next.next.next.next.val);
            Assert.AreEqual(null, result.next.next.next.next.next);
        }
        public void OJ024_SwapNodesInPairsTest1()
        {
            ListNode l1 = new ListNode(1);
            l1.next = new ListNode(2);
            l1.next.next = new ListNode(3);
            l1.next.next.next = new ListNode(4);
            l1.next.next.next.next = new ListNode(5);

            ListNode result = new OJ024_SwapNodesInPairs().SwapPairs(l1);
            Assert.AreEqual(2, result.val);
            Assert.AreEqual(1, result.next.val);
            Assert.AreEqual(4, result.next.next.val);
            Assert.AreEqual(3, result.next.next.next.val);
            Assert.AreEqual(5, result.next.next.next.next.val);
            Assert.AreEqual(null, result.next.next.next.next.next);
        }
        public void OJ002_AddTwoNumbersTest2()
        {
            ListNode l1 = new ListNode(1);

            ListNode l2 = new ListNode(9);
            l2.next = new ListNode(9);

            ListNode l3 = new ListNode(0);
            l3.next = new ListNode(0);
            l3.next.next = new ListNode(1);

            ListNode result = new OJ002_AddTwoNumbers().AddTwoNumbers(l1, l2);
            Assert.AreEqual(l3.val, result.val);
            Assert.AreEqual(l3.next.val, result.next.val);
            Assert.AreEqual(l3.next.next.val, result.next.next.val);
            Assert.IsNull(result.next.next.next);
        }
        private TreeNode generateBST(ListNode begin, ListNode end)
        {
            if (begin == end)
                return null;

            ListNode currentNode = begin;
            ListNode currentNodeHalf = begin;
            int i = 0;
            while (currentNode.next != end)
            {
                if (++i % 2 == 0)
                    currentNodeHalf = currentNodeHalf.next;
                currentNode = currentNode.next;
            }

            TreeNode node = new TreeNode(currentNodeHalf.val);
            node.left = generateBST(begin, currentNodeHalf);
            node.right = generateBST(currentNodeHalf.next, end);
            return node;
        }
        public void OJ002_AddTwoNumbersTest1()
        {
            ListNode l1 = new ListNode(2);
            l1.next = new ListNode(4);
            l1.next.next = new ListNode(3);

            ListNode l2 = new ListNode(5);
            l2.next = new ListNode(6);
            l2.next.next = new ListNode(4);

            ListNode l3 = new ListNode(7);
            l3.next = new ListNode(0);
            l3.next.next = new ListNode(8);

            ListNode result = new OJ002_AddTwoNumbers().AddTwoNumbers(l1, l2);
            Assert.AreEqual(l3.val, result.val);
            Assert.AreEqual(l3.next.val, result.next.val);
            Assert.AreEqual(l3.next.next.val, result.next.next.val);
            Assert.IsNull(result.next.next.next);
        }
        public ListNode DeleteDuplicates(ListNode head)
        {
            if (head == null)
                return null;

            ListNode prev = head;
            ListNode current = head.next;
            while (current != null)
            {
                if (current.val == prev.val)
                {
                    prev.next = current.next;
                }
                else
                {
                    prev = current;
                }
                current = current.next;
            }
            return head;
        }
        public void OJ021_MergeTwoSortedLists1()
        {
            ListNode l1 = new ListNode(1);
            l1.next = new ListNode(3);
            l1.next.next = new ListNode(12);
            l1.next.next.next = new ListNode(14);
            l1.next.next.next.next = new ListNode(15);

            ListNode l2 = new ListNode(2);
            l2.next = new ListNode(8);
            l2.next.next = new ListNode(12);

            ListNode result = new OJ021_MergeTwoSortedLists().MergeTwoLists(l1, l2);
            Assert.AreEqual(1, result.val);
            Assert.AreEqual(2, result.next.val);
            Assert.AreEqual(3, result.next.next.val);
            Assert.AreEqual(8, result.next.next.next.val);
            Assert.AreEqual(12, result.next.next.next.next.val);
            Assert.AreEqual(12, result.next.next.next.next.next.val);
            Assert.AreEqual(14, result.next.next.next.next.next.next.val);
            Assert.AreEqual(15, result.next.next.next.next.next.next.next.val);
            Assert.AreEqual(null, result.next.next.next.next.next.next.next.next);
        }
        public ListNode RemoveNthFromEnd(ListNode head, int n)
        {
            if (head == null)
                return null;

            ListNode p1 = head;
            ListNode p2 = head;

            int i = n;
            while (i-- > 0)
                p1 = p1.next;

            if (p1 == null)
                return p2.next;

            while (p1.next != null)
            {
                p1 = p1.next;
                p2 = p2.next;
            }

            p2.next = p2.next.next;
            return head;
        }
        public ListNode MergeTwoLists(ListNode l1, ListNode l2)
        {
            if (l1 == null && l2 == null)
                return null;

            ListNode lResult = new ListNode(0);
            ListNode l = lResult;
            while (true)
            {
                if (l1 == null)
                {
                    l.next = l2;
                    return lResult.next;
                }
                else if (l2 == null)
                {
                    l.next = l1;
                    return lResult.next;
                }
                else
                {
                    if (l1.val < l2.val)
                    {
                        l.next = l1;
                        l1 = l1.next;
                    }
                    else
                    {
                        l.next = l2;
                        l2 = l2.next;
                    }

                    l = l.next;
                }
            }
        }
 public TreeNode SortedListToBST(ListNode head)
 {
     if (head == null)
         return null;
     return this.generateBST(head, null);
 }
 public void OJ019_RemoveNthNodeFromEndOfListTest2()
 {
     ListNode l1 = new ListNode(1);
     ListNode result = new OJ019_RemoveNthNodeFromEndOfList().RemoveNthFromEnd(l1, 1);
     Assert.AreEqual(null, result);
 }
Exemplo n.º 26
0
 public static ListNode Next(this ListNode prev, int x)
 {
     ListNode node = new ListNode(x);
     prev.next = node;
     return node;
 }