查找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

