Erstellen Sie eine generische LinkedList in Java
-
eine kurze Einführung in
LinkedList
in Java -
eine generische Implementierung von Single
LinkedList
in Java
Dieser Artikel wird uns beibringen, wie man eine generische singly LinkedList
in Java erstellt.
eine kurze Einführung in LinkedList
in Java
LinkedLists
sind lineare Datenstrukturen, die Daten in Knoten an zufälligen Adressen und Mittel an nicht zusammenhängenden Stellen speichern.
Jeder Knoten besteht aus zwei Teilen: Daten
und Referenz
(Adresse). Das Feld Daten
/Wert
speichert den Wert, und das Feld Referenz
speichert die Adresse des nächsten Knotens der verknüpften Liste.
Einige der üblichen Operationen dieser Datenstruktur, die als Elementfunktionen implementiert werden, sind wie folgt.
addNode()
- Diese Methode wird verwendet, um ein neues Element am Ende derLinkedList
hinzuzufügen.removeNode(value)
– Diese Methode entfernt den Knoten mit dem angegebenen Wert.addNode(position,value)
- Diese Methode wird verwendet, um den Wert an einer bestimmten Position hinzuzufügen.clear()
- Diese Methode löscht die gesamteLinkedList
.isEmpty()
- Mit dieser Methode wird überprüft, ob dieLinkedList
leer ist oder nicht.length()
- Diese Methode liefert uns die Länge derLinkedList
.
eine generische Implementierung von Single LinkedList
in Java
Eine normale LinkedList
kann nur einen Werttyp speichern: Integer, String, Boolean, Float usw. Also müssen wir den Typ zum Zeitpunkt der Erstellung angeben, aber was ist, wenn wir die LinkedList
erstellen wollen, die das kann Daten eines beliebigen Datentyps speichern; Dafür verwenden wir in Java das Konzept der Generika
.
Erstellen einer generischen Knotenklasse:
Im folgenden Code bezeichnet T
den Datentyp, der auf LinkedList
gespeichert ist.
class Node<T> {
T value;
Node<T> nextPtr;
Node(T value) {
this.value = value;
this.nextPtr = null;
}
}
Lassen Sie uns nun die generischen Methoden zum Erstellen der Klasse LinkedList
erstellen.
-
Funktion
add()
:void add(T value) { Node<T> temp = new Node<>(value); // creating a new node if (this.head == null) // checking if the list is empty head = temp; else // if the list is not empty, we go till the end and add the node { Node<T> tr = head; while (tr.nextPtr != null) { tr = tr.nextPtr; } tr.nextPtr = temp; } length = length + 1; // increasing the length of list }
-
Funktion
remove()
:void remove(T key) { Node<T> prev = new Node<>(null); prev.nextPtr = head; Node<T> next = head.nextPtr; Node<T> tr = head; boolean isNodepresent = false; // to check if node is present if (head.value == key) { head = head.nextPtr; isNodepresent = true; } while (tr.nextPtr != null) { if (String.valueOf(tr.value).equals( String.valueOf(key))) { // if the node is present, we break the loop prev.nextPtr = next; // we assign previous node's nextPtr to next node isNodepresent = true; break; } prev = tr; // updating the previous and next pointers tr = tr.nextPtr; next = tr.nextPtr; } if (isNodepresent == false && String.valueOf(tr.value).equals(String.valueOf(key))) { prev.nextPtr = null; isNodepresent = true; } if (isNodepresent) { length--; // if the node is present, we reduce the length } else { System.out.println("The value is not present inside the LinkedList"); } }
-
Funktion
add(position,value)
:void add(int position, T value) { if (position > length + 1) // if the position entered is more than the list length { System.out.println("Position out of bound"); return; } if (position == 1) { // if the position is one we'll just Node<T> temp = head; head = new Node<T>(value); head.nextPtr = temp; return; } Node<T> tr = head; Node<T> prev = new Node<T>(null); // creating a new node prev while (position - 1 > 0) // we find the position in the list { prev = tr; tr = tr.nextPtr; position--; } prev.nextPtr = new Node<T>(value); // update the next pointer of previous node prev.nextPtr.nextPtr = tr; }
-
Funktion
getLength()
:int getLength() { return this.length; // returns the length of the list }
-
Funktion
isEmpty()
:boolean isEmpty() { if (head == null) // if the list is empty we return true return true; else return false; }
-
clear()
-Funktion:void clear() { head = null; // make head as null and length as zero length = 0; }
-
Funktion
toString()
:Im folgenden Code haben wir die Methode
toString
hinzugefügt und überschrieben, um den Inhalt derLinkedList
zu drucken.@Override public String toString() { Node<T> temp = head; String str = "{ "; if (temp == null) // if the list is empty { System.out.println("list is empty"); } while (temp.nextPtr != null) // we keep appending data to string till the list is empty { str += String.valueOf(temp.value) + "->"; temp = temp.nextPtr; } str += String.valueOf(temp.value); return str + "}"; // we finally return the string }
Vollständiger Arbeitscode mit der Klasse Haupt
:
class Node<T> {
T value;
Node<T> nextPtr;
Node(T value) {
this.value = value;
this.nextPtr = null;
}
}
class LinkedList<T>
{
Node<T> head;
private int length = 0;
LinkedList()
{
this.head = null;
}
void add(T value)
{
Node<T> temp = new Node<>(value);
if(this.head == null)
head = temp;
else
{
Node<T> tr = head;
while(tr.nextPtr!=null){
tr = tr.nextPtr;
}
tr.nextPtr = temp;
}
length = length + 1;
}
void remove(T key)
{
Node<T> prev = new Node<>(null);
prev.nextPtr = head;
Node<T> next = head.nextPtr;
Node<T> tr = head;
boolean isNodepresent = false;
if(head.value == key ){
head = head.nextPtr;
isNodepresent =true;
}
while(tr.nextPtr!=null)
{
if(String.valueOf(tr.value).equals(String.valueOf(key))){
prev.nextPtr = next;
isNodepresent = true;
break;
}
prev = tr;
tr = tr.nextPtr;
next = tr.nextPtr;
}
if(isNodepresent==false && String.valueOf(tr.value).equals(String.valueOf(key))){
prev.nextPtr = null;
isNodepresent = true;
}
if(isNodepresent)
{
length--;
}
else
{
System.out.println("The value is not present inside the LinkedList");
}
}
void add(int position,T value)
{
if(position>length+1)
{
System.out.println("Position out of bound");
return;
}
if(position==1){
Node<T> temp = head;
head = new Node<T>(value);
head.nextPtr = temp;
return;
}
Node<T> tr = head;
Node<T> prev = new Node<T>(null);
while(position-1>0)
{
prev = tr;
tr = tr.nextPtr;
position--;
}
prev.nextPtr = new Node<T>(value);
prev.nextPtr.nextPtr = tr;
}
int getLength()
{
return this.length;
}
boolean isEmpty()
{
if(head == null)
return true;
else
return false;
}
void clear()
{
head = null;
length = 0;
}
@Override
public String toString()
{
Node<T> temp = head;
String str = "{ ";
if(temp == null)
{
System.out.println( "list is empty");
}
while(temp.nextPtr!=null)
{
str += String.valueOf(temp.value) +"->";
temp = temp.nextPtr;
}
str += String.valueOf(temp.value);
return str+"}";
}
}
public class Example
{
public static void main(String[] args) {
LinkedList<Integer> ll = new LinkedList<>();
ll.add(1);
ll.add(2);
ll.add(3);
System.out.println(ll);
ll.remove(3);
System.out.println(ll);
ll.add(2,800);
System.out.println(ll);
}
}
Ausgang:
{ 1->2->3}
{ 1->2}
{ 1->800->2}