查找Java中链接列表的中间元素
时间:2020-02-23 14:34:11 来源:igfitidea点击:
在本教程中,我们将以最有效的方式讨论如何在LinkedList中找到中间元素。
假设:
我不在这里使用Java LinkedList API。
如果使用该API,则可以使用size()函数直接查找linkedlist的大小,然后定位长度/2.
算法之一:
- 遍历列表并找到列表的长度
- 查找长度后,再次遍历列表并从LinkedList的Head定位N/2元素。
时间复杂度=查找列表长度的时间+定位中间元素的时间= O(n)+ O(n)= o(n)空间复杂度= o(1)。
有效的方法:
上面的方法将需要两个遍历,但我们可以在一个遍历中找到中间元素也使用以下algo:
- 使用两个指针fastptr和stropptr并初始化链接列表头部
- 每次迭代中的一个节点将FastPtr移动到两个节点和慢动网。
- 当FastPtr到达节点的末尾时,慢动力指针将指向中间元素。
让我们为此创建Java程序:
package org.igi.theitroad; /** @author: igi Mandliya */ public class LinkedList{ private Node head; private static class Node { private int value; private Node next; Node(int value) { this.value = value; } } public void addToTheLast(Node node) { if (head == null) { head = node; } else { Node temp = head; while (temp.next != null) temp = temp.next; temp.next = node; } } public void printList() { Node temp = head; while (temp != null) { System.out.format("%d ", temp.value); temp = temp.next; } System.out.println(); } //This function will find middle element in linkedlist public Node findMiddleNode(Node head) { Node slowPointer, fastPointer; slowPointer = fastPointer = head; while(fastPointer !=null) { fastPointer = fastPointer.next; if(fastPointer != null && fastPointer.next != null) { slowPointer = slowPointer.next; fastPointer = fastPointer.next; } } return slowPointer; } public static void main(String[] args) { LinkedList list = new LinkedList(); //Creating a linked list Node head=new Node(5); list.addToTheLast(head); list.addToTheLast(new Node(6)); list.addToTheLast(new Node(7)); list.addToTheLast(new Node(1)); list.addToTheLast(new Node(2)); list.printList(); //finding middle element Node middle= list.findMiddleNode(head); System.out.println("Middle node will be: "+ middle.value); } }
运行上面的程序,我们将获取以下输出:
5 6 7 1 2 Middle node is: 7