content: package linkedlist;
  
  public class FindMiddleNode {
  
  
      /*
       * Find middle node of linked list in Java in one pass
       * */
      public static LinkedList.Node findMiddleNode(LinkedList linkedList) {
          LinkedList.Node current = linkedList.head();
          LinkedList.Node middle = linkedList.head();
  
          int length = 0;
          while (current.next() != null) {
              length++;
  
              if(length%2 == 0) {
                  middle = middle.next();
              }
              current = current.next();
          }
  
          if(length%2 == 1) {
              middle = middle.next();
          }
  
          return middle;
      }
  
  
      private static class LinkedList {
  
          private Node head;
          private Node tail;
          public LinkedList() {
              head = new Node("head");
              tail = head;
          }
  
          public void add(Node node) {
              tail.setNext(node);
              tail = node;
          }
  
          public Node head() {
              return head;
          }
  
          public static class Node {
              private Node next;
              private String data;
              public Node(String data) {
                  this.data = data;
              }
  
              public Node next() {
                  return next;
              }
  
              public void setNext(Node next) {
                  this.next = next;
              }
  
              public String data() {
                  return data;
              }
  
              public void setData(String data) {
                  this.data = data;
              }
          }
      }
  
  
      public static void main(String [] args) {
  
          LinkedList linkedList = new LinkedList();
          linkedList.add( new LinkedList.Node("1"));
          linkedList.add( new LinkedList.Node("2"));
          linkedList.add( new LinkedList.Node("3"));
          linkedList.add( new LinkedList.Node("4"));
  
          System.out.println(findMiddleNode(linkedList).data());
      }
  }
  