📜  用于查找给定链表的中间元素的Java程序

📅  最后修改于: 2022-05-13 01:55:09.664000             🧑  作者: Mango

用于查找给定链表的中间元素的Java程序

给定一个单链表,找到链表的中间。例如,如果给定的链表是 1->2->3->4->5,那么输出应该是 3。
如果有偶数节点,那么就会有两个中间节点,我们需要打印第二个中间元素。例如,如果给定的链表是 1->2->3->4->5->6,那么输出应该是 4。

方法一:
遍历整个链表并计算编号。的节点。现在再次遍历列表直到 count/2 并返回 count/2 处的节点。

方法二:
使用两个指针遍历链表。将一个指针移动一格,将其他指针移动二格。当快指针到达末尾时,慢指针将到达链表的中间。

下图显示了 printMiddle函数在代码中的工作方式:

C 和 Java1 中给定链表的中间

Java
// Java program to find middle of 
// the linked list
class LinkedList
{
    // Head of linked list
    Node head; 
  
    // Linked list node 
    class Node
    {
        int data;
        Node next;
        Node(int d)
        {
            data = d;
            next = null;
        }
    }
  
    // Function to print middle of 
    // the linked list 
    void printMiddle()
    {
        Node slow_ptr = head;
        Node fast_ptr = head;
        if (head != null)
        {
            while (fast_ptr != null && 
                   fast_ptr.next != null)
            {
                fast_ptr = fast_ptr.next.next;
                slow_ptr = slow_ptr.next;
            }
            System.out.println("The middle element is [" +
                                slow_ptr.data + "]");
        }
    }
  
    // Inserts a new Node at front of the list.
    public void push(int new_data)
    {
        /* 1 & 2: Allocate the Node &
                  Put in the data*/
        Node new_node = new Node(new_data);
  
        // 3. Make next of new Node as head 
        new_node.next = head;
  
        // 4. Move the head to point to new Node 
        head = new_node;
    }
  
    // This function prints contents of linked list
    // starting from  the given node 
    public void printList()
    {
        Node tnode = head;
        while (tnode != null)
        {
            System.out.print(tnode.data + "->");
            tnode = tnode.next;
        }
        System.out.println("NULL");
    }
   
    // Driver code
    public static void main(String [] args)
    {
        LinkedList llist = new LinkedList();
        for (int i = 5; i > 0; --i)
        {
            llist.push(i);
            llist.printList();
            llist.printMiddle();
        }
    }
}
// This code is contributed by Rajat Mishra


Java
// Java program to implement the
// above approach
class GFG
{
    static Node head;
  
    // Link list node
    class Node
    {
        int data;
        Node next;
  
        // Constructor
        public Node(Node next, 
                    int data)
        {
            this.data = data;
            this.next = next;
        }
    }
  
    // Function to get the middle of 
    // the linked list
    void printMiddle(Node head)
    {
        int count = 0;
        Node mid = head;
  
        while (head != null)
        {
            // Update mid, when 'count' 
            // is odd number 
            if ((count % 2) == 1)
                mid = mid.next;
  
            ++count;
            head = head.next;
        }
  
        // If empty list is provided 
        if (mid != null)
            System.out.println("The middle element is [" +
                                mid.data + "]\n");
    }
  
    void push(Node head_ref, int new_data)
    {
      
        // Allocate node 
        Node new_node = new Node(head_ref, 
                                 new_data);
  
        // Move the head to point to the new node 
        head = new_node;
    }
  
    // A utility function to print a 
    // given linked list
    void printList(Node head)
    {
        while (head != null)
        {
            System.out.print(head.data + "-> ");
            head = head.next;
        }
        System.out.println("null");
    }
  
    // Driver code
    public static void main(String[] args)
    {
        GFG ll = new GFG();
  
        for(int i = 5; i > 0; i--) 
        {
            ll.push(head, i);
            ll.printList(head);
            ll.printMiddle(head);
        }
    }
}
// This code is contributed by mark_3


输出:

5->NULL
The middle element is [5]

4->5->NULL
The middle element is [5]

3->4->5->NULL
The middle element is [4]

2->3->4->5->NULL
The middle element is [4]

1->2->3->4->5->NULL
The middle element is [3]

方法三:
将 mid 元素初始化为 head 并将计数器初始化为 0。从 head 遍历列表,同时遍历递增计数器并在计数器为奇数时将 mid 更改为 mid->next。所以中间只会移动列表总长度的一半。
感谢 Narendra Kangralkar 提出这种方法。

Java

// Java program to implement the
// above approach
class GFG
{
    static Node head;
  
    // Link list node
    class Node
    {
        int data;
        Node next;
  
        // Constructor
        public Node(Node next, 
                    int data)
        {
            this.data = data;
            this.next = next;
        }
    }
  
    // Function to get the middle of 
    // the linked list
    void printMiddle(Node head)
    {
        int count = 0;
        Node mid = head;
  
        while (head != null)
        {
            // Update mid, when 'count' 
            // is odd number 
            if ((count % 2) == 1)
                mid = mid.next;
  
            ++count;
            head = head.next;
        }
  
        // If empty list is provided 
        if (mid != null)
            System.out.println("The middle element is [" +
                                mid.data + "]\n");
    }
  
    void push(Node head_ref, int new_data)
    {
      
        // Allocate node 
        Node new_node = new Node(head_ref, 
                                 new_data);
  
        // Move the head to point to the new node 
        head = new_node;
    }
  
    // A utility function to print a 
    // given linked list
    void printList(Node head)
    {
        while (head != null)
        {
            System.out.print(head.data + "-> ");
            head = head.next;
        }
        System.out.println("null");
    }
  
    // Driver code
    public static void main(String[] args)
    {
        GFG ll = new GFG();
  
        for(int i = 5; i > 0; i--) 
        {
            ll.push(head, i);
            ll.printList(head);
            ll.printMiddle(head);
        }
    }
}
// This code is contributed by mark_3

输出:

5->NULL
The middle element is [5]

4->5->NULL
The middle element is [5]

3->4->5->NULL
The middle element is [4]

2->3->4->5->NULL
The middle element is [4]

1->2->3->4->5->NULL
The middle element is [3]

有关详细信息,请参阅有关查找给定链接列表的中间的完整文章!