public boolean isPalindrome() {
      if (_root == null) {
         return false;
      }

      if (_root.Next == null || (_root.Next.Next == null && _root.Data == _root.Next.Data)) {
         return true;
      }

      final Stack<T> stack = new Stack<T>();
      Node<T> by1Runner = _root;
      Node<T> by2Runner = _root;

      // Pushing items from the first half of the list to the stack.
      // When the by2Runner reaches the end of the list, by1Runner
      // would be around or at the middle of the list.
      while (by2Runner != null && by2Runner.Next != null) {
         stack.push(by1Runner.Data);
         by1Runner = by1Runner.Next;
         by2Runner = by2Runner.Next.Next;
      }

      // If the by2Runner has not reached the end, we adjust
      // by1Runner by pushing past the middle item in the list.
      if (by2Runner != null) {
         by1Runner = by1Runner.Next;
      }

      while (by1Runner != null) {
         final T data = stack.pop();

         if (data != by1Runner.Data) {
            return false;
         }

         by1Runner = by1Runner.Next;
      }

      return true;
   }