public ListNode GetIntersectionNode(ListNode headA, ListNode headB)
 {
     if (headA == null || headB == null)
         return null;
     var countA = Count(headA);
     var countB = Count(headB);
     if (countA > countB)
         for (int i = 0; i < countA - countB; i++)
             headA = headA.next;
     else if (countA < countB)
         for (int i = 0; i < countB - countA; i++)
             headB = headB.next;
     ListNode result = null;
     while (headA != null)
     {
         if (headA.val == headB.val)
         {
             if (result == null)
                 result = headA;
         }
         else
             result = null;
         headA = headA.next;
         headB = headB.next;
     }
     return result;
 }
 public ListNode RemoveNthFromEnd(ListNode head, int n)
 {
     ListNode t = head;
     ListNode p = head;
     if (head == null)
         return null;
     else if (head.next == null && n > 0)
         return null;
     for (int i = 0; i < n - 1; i++)
         t = t.next;
     if (t.next == null)
         return head.next;
     else
         t = t.next;
     while (true)
     {
         if (t.next == null)
         {
             if (p.next == head)
                 return head.next;
             else
                 p.next = p.next.next;
             break;
         }
         else
         {
             p = p.next;
             t = t.next;
         }
     }
     return head;
 }
 private int Count(ListNode head)
 {
     if (head == null)
         return 0;
     int count = 0;
     while (head != null)
     {
         count++;
         head = head.next;
     }
     return count;
 }
 public ListNode DeleteDuplicates(ListNode head)
 {
     if (head == null)
         return null;
     var node = head;
     while (node.next != null)
     {
         if (node.val == node.next.val)
             node.next = node.next.next;
         else
             node = node.next;
     }
     return head;
 }
 public bool HasCycle(ListNode head)
 {
     if (head == null || head.next == null)
         return false;
     var slowpoint = head;
     var fastpoint = head;
     while (true)
     {
         if (fastpoint.next != null && fastpoint.next.next != null)
         {
             fastpoint = fastpoint.next.next;
             slowpoint = slowpoint.next;
             if (fastpoint == slowpoint)
                 return true;
         }
         else
             return false;
     }
 }
 private bool Check(ListNode current, ref ListNode head, ref bool isover)
 {
     //start to compare, it's the end of the linkedlist
     if (current == null)
         return true;
     var result = Check(current.next, ref head, ref isover);
     if (result == false)
         return false;
     else if (isover)
         return true;
     else if (current.val != head.val)
         return false;
     else
     {
         if (head == current || head.next == current)
             isover = true;
         else
             head = head.next;
         return true;
     }
 }
 public ListNode ReverseList(ListNode head)
 {
     if (head == null || head.next == null)
         return head;
     else
     {
         var p1 = head;
         var p2 = head.next;
         var p3 = head.next.next;
         p1.next = null;
         while (p2 != null)
         {
             p2.next = p1;
             if (p3 == null)
                 break;
             p1 = p2;
             p2 = p3;
             p3 = p2.next;
         }
         return p2;
     }
 }
 public ListNode RemoveElements(ListNode head, int val)
 {
     while (head != null && head.val == val)
         head = head.next;
     if (head == null)
         return null;
     else if (head.next == null)
         return head;
     else
     {
         var p = head;
         while (p.next.next != null)
         {
             if (p.next.val == val)
                 p.next = p.next.next;
             else
                 p = p.next;
         }
         if (p.next.val == val)
             p.next = null;
         return head;
     }
 }
 public bool IsPalindrome(ListNode head)
 {
     bool isover = false;
     return Check(head, ref head, ref isover);
 }
 public ListNode(int x)
 {
     val = x;
     next = null;
 }
 public void DeleteNode(ListNode node)
 {
     node.val = node.next.val;
     node.next = node.next.next;
 }