linked list java linked list implementation java examples
Αυτό το σεμινάριο εξηγεί τι είναι μια δομή δεδομένων συνδεδεμένης λίστας στην Java και πώς να δημιουργήσετε, να ξεκινήσετε, να εφαρμόσετε, να διασχίσετε, να αντιστρέψετε και να ταξινομήσετε μια λίστα συνδεδεμένη με Java:
Στην Java, το LinkedList είναι μια δομή δεδομένων που αποθηκεύει στοιχεία σε μια μη συνεχόμενη τοποθεσία. Είναι μια γραμμική δομή δεδομένων.
Κάθε στοιχείο δεδομένων ονομάζεται «Κόμβος» και κάθε κόμβος έχει ένα τμήμα δεδομένων και ένα τμήμα διεύθυνσης. Το τμήμα διεύθυνσης αποθηκεύει τον σύνδεσμο προς τον επόμενο κόμβο στο LinkedList.
=> Επισκεφθείτε εδώ για να δείτε τη σειρά εκπαίδευσης Java για όλους.
Τι θα μάθετε:
- LinkedList στην Java
- Τάξη LinkedList Java
- Πώς να δημιουργήσετε μια συνδεδεμένη λίστα στην Java
- Εφαρμογή συνδεδεμένης λίστας σε Java
- Traverse / Print Linked List στη Java
- Μέθοδοι LinkedList
- Αντίστροφη συνδεδεμένη λίστα στην Java
- Ταξινόμηση μιας συνδεδεμένης λίστας στην Java
- Κατάργηση διπλότυπων
- Κυκλική συνδεδεμένη λίστα στην Java
- Java 8 LinkedList
- Συχνές Ερωτήσεις
- συμπέρασμα
LinkedList στην Java
Δίνεται παρακάτω η γενική διάταξη του LinkedList:
Όπως φαίνεται στην παραπάνω αναπαράσταση του LinkedList, κάθε στοιχείο στο LinkedList είναι ο 'Κόμβος'. Κάθε κόμβος έχει δύο μέρη, το πρώτο μέρος αποθηκεύει τα δεδομένα και το δεύτερο μέρος έχει μια αναφορά ή δείκτη ή διεύθυνση του επόμενου κόμβου στο LinkedList.
μετατροπή βίντεο youtube σε αρχείο wav
Αυτή η ρύθμιση είναι απαραίτητη καθώς τα δεδομένα στο LinkedList αποθηκεύονται σε μη γειτονικές τοποθεσίες, σε αντίθεση με τους πίνακες.
Το 'Head' του LinkedList είναι ένας δείκτης που περιέχει τη διεύθυνση του πρώτου στοιχείου στο LinkedList. Ο τελευταίος κόμβος στο LinkedList είναι η ουρά. Όπως φαίνεται στην παραπάνω εικόνα, το τμήμα διεύθυνσης του τελευταίου κόμβου στο LinkedList έχει οριστεί σε 'Null' που δείχνει το τέλος του LinkedList.
Το παραπάνω διάγραμμα αντιπροσωπεύει ένα « Λίστα μεμονωμένη σύνδεση 'Που αποθηκεύει τη διεύθυνση μόνο του επόμενου κόμβου στο LinkedList.
Υπάρχει μια άλλη έκδοση γνωστή ως ' Διπλά συνδεδεμένη λίστα 'Του οποίου κάθε κόμβος έχει τρία μέρη:
- Διεύθυνση ή αναφορά ή δείκτης στο προηγούμενο στοιχείο στο LinkedList.
- Μέρος δεδομένων
- Διεύθυνση ή αναφορά ή δείκτης στο επόμενο στοιχείο στο LinkedList.
Η προηγούμενη διεύθυνση του πρώτου στοιχείου στο LinkedList θα οριστεί σε Null ενώ ο επόμενος δείκτης του τελευταίου στοιχείου στο LinkedList έχει οριστεί σε Null.
Αναπαράσταση της διπλής συνδεδεμένης λίστας:
Όπως φαίνεται στην παραπάνω αναπαράσταση, κάθε κόμβος στη λίστα διπλά συνδεδεμένων έχει δείκτες του προηγούμενου και του επόμενου κόμβου του (που αντιπροσωπεύεται έτσι χωρίς βέλη). Ο προηγούμενος δείκτης του πρώτου κόμβου δείχνει το null ενώ ο επόμενος δείκτης του τελευταίου κόμβου δείχνει το null.
Σε αυτό το σεμινάριο LinkedList, θα ασχοληθούμε κυρίως με τη μοναδικά συνδεδεμένη λίστα. Θα συζητήσουμε τη διπλά συνδεδεμένη λίστα στο επόμενο σεμινάριό μας.
Τάξη LinkedList Java
Στην Java, η συνδεδεμένη λίστα υλοποιείται από το “ Συνδεδεμένη λίστα 'Τάξη. Αυτή η τάξη ανήκει στο « java.util Πακέτο. Η κλάση LinkedList εφαρμόζει τις διασυνδέσεις List και Deque και κληρονομεί την κλάση AbstractList.
Παρακάτω δίνεται η ιεραρχία τάξης της κλάσης LinkedList.
Το παραπάνω διάγραμμα δείχνει την ιεραρχία της κλάσης LinkedList. Όπως φαίνεται, η κλάση LinkedList εφαρμόζει τις διασυνδέσεις List και Deque.
Όπως ήδη αναφέρθηκε, η τάξη LinkedList είναι μέρος του « java.util Πακέτο. Ως εκ τούτου, θα πρέπει να μπορείτε να χρησιμοποιήσετε την τάξη LinkedList στο πρόγραμμά σας συμπεριλαμβάνοντας μία από τις ακόλουθες δηλώσεις στο πρόγραμμά σας.
import java.util.*;
Ή
import java.util.LinkedList;
Με βάση την παραπάνω ιεραρχία, ένας τυπικός ορισμός της κλάσης LinkedList έχει ως εξής:
public class LinkedList extends AbstractSequentialList implements List, Deque, Cloneable, Serializable
Παρατίθενται παρακάτω είναι μερικά από τα χαρακτηριστικά της κλάσης LinkedList που πρέπει να θυμάστε:
- Αυτή η τάξη δεν είναι συγχρονισμένη.
- Επιτρέπει διπλές τιμές.
- Διατηρεί τη σειρά εισαγωγής.
- Δεδομένου ότι τα στοιχεία δεν απαιτείται να μετατοπιστούν κατά τη μετακίνηση, ο χειρισμός των στοιχείων σε αυτό είναι ταχύτερος.
- Αυτή η τάξη μπορεί να χρησιμοποιηθεί για την εφαρμογή στοίβας, ουράς και λίστας.
Πώς να δημιουργήσετε μια συνδεδεμένη λίστα στην Java
Προτού προχωρήσουμε στη δημιουργία μιας συνδεδεμένης λίστας στην Java, ας συζητήσουμε πρώτα έναν κόμβο συνδεδεμένης λίστας στην Java.
Όπως ήδη συζητήθηκε, μια συνδεδεμένη λίστα αποτελείται από κόμβους. Έτσι, στην Java, μπορούμε να αντιπροσωπεύουμε ένα LinkedList ως κλάση με τον κόμβο του ως ξεχωριστή τάξη. Ως εκ τούτου, αυτή η τάξη θα έχει αναφορά στον τύπο κόμβου.
Αυτό φαίνεται όπως παρακάτω:
class LinkedList { Node head; // list head //node - linkedlist class Node { int data; Node next; Node(int d) { data = d; } //constructor to create a new node } }
Για να δημιουργήσετε ένα αντικείμενο τύπου LinkedList, υπάρχουν δύο κύριοι κατασκευαστές ως εξής:
# 1) LinkedList ()
Η γενική σύνταξη για αυτόν τον κατασκευαστή είναι:
LinkedList linkedList = new LinkedList();
Η παραπάνω δήλωση δημιουργεί ένα άδειο LinkedList.
Για παράδειγμα,
LinkedList l_list = new LinkedList();
Αυτό θα δημιουργήσει μια κενή συνδεδεμένη λίστα με το όνομα l_list.
# 2) LinkedList (Συλλογή γ)
Η γενική σύνταξη είναι:
LinkedList linkedList = new LinkedList (Collection c);
Η παραπάνω δήλωση δημιουργεί ένα LinkedList με στοιχεία από τη συλλογή c ως αρχικά στοιχεία.
Όπως και άλλες δομές δεδομένων λίστας που έχουμε ήδη δει, η συνδεδεμένη λίστα μπορεί επίσης να αρχικοποιηθεί χρησιμοποιώντας τη μέθοδο προσθήκης, τη μέθοδο Arrays.asList () ή χρησιμοποιώντας τον κατασκευαστή με τη συλλογή ως επιχείρημα.
Εφαρμογή συνδεδεμένης λίστας σε Java
Δίνεται παρακάτω είναι ένα απλό παράδειγμα μιας δομής δεδομένων LinkedList στην Java. Σε αυτό το παράδειγμα εφαρμογής, θα χρησιμοποιήσουμε τη μέθοδο προσθήκης και τη μέθοδο asList για την αρχικοποίηση των αντικειμένων LinkedList.
import java.util.*; public class Main{ public static void main(String() args) { //create a LinkedList object and initialize it with Array elements converted to list LinkedList intList = new LinkedList<>(Arrays.asList(10,20,30,40,50)); //print the LinkedList just created System.out.println('Contents of first LinkedList: ' + intList); //create an empty list LinkedList colorsList = new LinkedList<>(); //add elements to the linkedList using add method. colorsList.add('Red'); colorsList.add('Green'); colorsList.add('Blue'); colorsList.add('Cyan'); colorsList.add('Magenta'); // print the LinkedList System.out.println('
Contents of second LinkedList: ' + colorsList); } }
Παραγωγή:
Περιεχόμενα του πρώτου LinkedList: (10, 20, 30, 40, 50)
Περιεχόμενα της δεύτερης LinkedList: (Κόκκινο, Πράσινο, Μπλε, Κυανό, Ματζέντα)
Το παραπάνω πρόγραμμα δείχνει τη δημιουργία και την προετοιμασία του LinkedList. Αρχικά, δημιουργούμε ένα LinkedList τύπου Integer και παρέχουμε μια σειρά από Integers που μετατρέπονται σε λίστα χρησιμοποιώντας τη μέθοδο asList ως αρχικές τιμές για το LinkedList.
Στη συνέχεια, δημιουργούμε ένα κενό LinkedList τύπου String και στη συνέχεια χρησιμοποιώντας τη μέθοδο προσθήκης, προσθέτουμε τιμές στο LinkedList.
Τέλος, εμφανίζουμε και τα δύο αντικείμενα LinkedList ως συμβολοσειρά.
Traverse / Print Linked List στη Java
Για να εκτυπώσετε τα περιεχόμενα ή να εκτελέσετε οποιεσδήποτε λειτουργίες στα στοιχεία του LinkedList, πρέπει να διασχίσετε τα στοιχεία του. Έχουμε ήδη δει αυτές τις μεθόδους στα προηγούμενα σεμινάρια μας. Σε αυτήν την ενότητα, θα συζητήσουμε τα παραδείγματα του καθενός σε σχέση με το LinkedList.
Χρήση για βρόχο
import java.util.LinkedList; class Main { public static void main(String() args) { // Create a LinkedList and initialize it LinkedList colorList = new LinkedList<>(); colorList.add('Red'); colorList.add('Green'); colorList.add('Blue'); // Using for loop,print the contents of the LinkedList System.out.println('LinkedList elements using for loop:'); for(int i=0; i Παραγωγή:
Στοιχεία LinkedList που χρησιμοποιούν για βρόχο:
Κόκκινο πράσινο μπλε

Χρησιμοποιώντας για κάθε βρόχο
import java.util.LinkedList; class Main { public static void main(String() args) { // Create a LinkedList and initialize it LinkedList colorList = new LinkedList<>(); colorList.add('Red'); colorList.add('Green'); colorList.add('Blue'); // Using forEach loop,print the contents of the LinkedList System.out.println('LinkedList elements using forEach loop:'); for(String color:colorList) { System.out.print(color + ' '); } } }
Παραγωγή:
Στοιχεία LinkedList με χρήση για κάθε βρόχο:
Κόκκινο πράσινο μπλε

Χρησιμοποιώντας το Iterator
import java.util.*; public class Main{ public static void main(String args()){ //declare a LinkedList object LinkedList l_list=new LinkedList(); //Add elements to LinkedList l_list.add('Red'); l_list.add('Green'); l_list.add('Blue'); l_list.add('Yellow'); //declare an iterator for the LinkedList Iterator itr=l_list.iterator(); System.out.println('The contents of Linked List:'); //Iterate through the LinkedList using Iterator and print its elements while(itr.hasNext()){ System.out.print(itr.next() + ' '); } } }
Παραγωγή:
Τα περιεχόμενα της συνδεδεμένης λίστας:
Κόκκινο πράσινο μπλε κίτρινο
java 8 νέες δυνατότητες με παραδείγματα

Μέθοδοι LinkedList
Η κλάση LinkedList παρέχει API που υποστηρίζει διάφορες μεθόδους για να χειριστεί τη λίστα Linked. Παραθέτουμε τις μεθόδους στο API LinkedList παρακάτω.
Θα συζητήσουμε τις κύριες λειτουργίες / μεθόδους στην επόμενη ενότητα.
Μέθοδος Πρωτότυπο Περιγραφή Σαφή κενό καθαρό () Διαγράφει όλα τα στοιχεία από τη λίστα. Προσθήκη boolean add (E ε) Προσθέστε ένα καθορισμένο στοιχείο στη LinkedList άκυρη προσθήκη (int index, E element) Προσθήκη στοιχείου στο δεδομένο ευρετήριο στο LinkedList Προσθήκη όλων boolean addAll (Συλλογή γ) Προσθέτει τα στοιχεία της δεδομένης συλλογής c στο τέλος του LinkedList. boolean addAll (int ευρετήριο, Συλλογή γ) Προσθέτει τα στοιχεία της δεδομένης συλλογής c στο καθορισμένο ευρετήριο στο LinkedList addFirst void addFirst (E ε) Προσθέστε το δεδομένο στοιχείο ως το πρώτο στοιχείο στο LinkedList. addLast void addLast (E ε) Προσθέστε το δεδομένο στοιχείο στο τέλος της λίστας. Κλώνος Αντικείμενο κλώνου () Κάνει ένα ρηχό αντίγραφο του LinkedList Περιέχει Το Boolean περιέχει (αντικείμενο o) Ελέγχει εάν η λίστα περιέχει συγκεκριμένα στοιχεία. αν ναι επιστρέφει αλήθεια. φθίνουσαIterator Iterator φθίνουσαIterator () Επιστρέφει έναν επαναληπτικό αντίστροφη σειρά για το LinkedList. Στοιχείο E στοιχείο () Επιστρέφει το στοιχείο στην κορυφή της λίστας. Παίρνω E get (int index) Παίρνει το στοιχείο στο καθορισμένο ευρετήριο. getFirst E getFirst () Ανακτά το πρώτο στοιχείο στο LinkedList. getLast E getLast () Ανακτά το τελευταίο στοιχείο στο LinkedList. ευρετήριο Int indexOf (Αντικείμενο o) Βρείτε το ευρετήριο της πρώτης εμφάνισης των δεδομένων στοιχείων στη λίστα και επιστρέψτε το ευρετήριο. -1 εάν το στοιχείο δεν βρέθηκε. lastIndexOf Int lastIndexOf (αντικείμενο o) Επιστρέφει τη θέση της τελευταίας εμφάνισης του δεδομένου στοιχείου στο LinkedList · -1 εάν το δεδομένο στοιχείο δεν υπάρχει listIterator ListIterator listIterator (int ευρετήριο) Επιστρέφει το listIterator από το καθορισμένο ευρετήριο στη συνδεδεμένη λίστα. Προσφορά boolean προσφορά (E ε) Προσθέτει το δεδομένο στοιχείο ως το τελευταίο στοιχείο (ουρά) στο LinkedList. προσφορά Πρώτα Boolean προσφοράΠρώτα (E ε) Προσθέτει το δεδομένο στοιχείο ως το πρώτο στοιχείο στο LinkedList. προσφορά Τελευταία Boolean offerLast (E ε) Προσθέστε δεδομένο στοιχείο e στο τέλος του LinkedList. Κρυφοκοίταγμα E peek () Επιστρέφει την κεφαλή της λίστας χωρίς να την καταργήσετε. peekFirst E peekFirst () Επιστρέφει το πρώτο στοιχείο στη λίστα. επιστρέφει null εάν η λίστα είναι κενή. peekLast Ε peekLast () Επιστρέφει το τελευταίο στοιχείο ή μηδέν εάν η λίστα είναι κενή. Δεν διαγράφει το στοιχείο. Ψηφοφορία E δημοσκόπηση () Επιστρέφει την κεφαλή του LinkedList και την αφαιρεί επίσης. pollFirst Πρώτη δημοσκόπηση () Επιστρέφει και διαγράφει το πρώτο στοιχείο στη λίστα. επιστρέφει null εάν η λίστα είναι κενή. pollLast E pollLast () Επιστρέφει και διαγράφει το τελευταίο στοιχείο στη λίστα. επιστρέφει null εάν η λίστα είναι κενή. Κρότος E pop () Εμφανίζει το στοιχείο από την αναπαράσταση στοίβας του LinkedList. Σπρώξτε Void push (E ε) Πιέζει ή εισάγει ένα στοιχείο στην αναπαράσταση στοίβας του LinkedList. Αφαιρώ E αφαίρεση () Αφαιρεί και επιστρέφει την κεφαλή του LinkedList. E κατάργηση (int index) Διαγράφει το στοιχείο στο δεδομένο ευρετήριο από το LinkedList. boolean remove (Αντικείμενο o) Διαγράφει την πρώτη εμφάνιση του δεδομένου στοιχείου από το LinkedList. αφαιρέστε πρώτα E removeFirst () Επιστρέφει και διαγράφει το πρώτο στοιχείο από τη λίστα. αφαίρεσηFirstOccurence boolean removeFirstOccurrence (αντικείμενο o) Διαγράφει την πρώτη εμφάνιση του δεδομένου στοιχείου από τη λίστα όταν η λίστα διέρχεται από το κεφάλι στην ουρά. αφαίρεση Τελευταία E removeLast () Επιστρέφει το τελευταίο στοιχείο στο LinkedList και διαγράφει επίσης. αφαίρεσηLastOccurence boolean removeLastOccurrence (αντικείμενο o) Καταργεί την τελευταία εμφάνιση του δεδομένου στοιχείου από το LinkedList όταν διασχίζεται από το κεφάλι στην ουρά Σειρά Σετ E (int index, E element) Ορίζει το δεδομένο στοιχείο στο δεδομένο ευρετήριο. Αντικαθιστά το τρέχον στοιχείο με νέο. Μέγεθος Μέγεθος Int () Εμφανίζει το μέγεθος ή τον αριθμό των στοιχείων στο LinkedList στο Array Αντικείμενο () toArray () Μετατρέπει το LinkedList σε πίνακα που περιέχει όλα τα στοιχεία λίστας με τη σωστή σειρά T () toArray (T () α) Μετατρέπει το LinkedList σε πίνακα με τύπο χρόνου εκτέλεσης ίδιο με το όρισμα α.
Το παρακάτω πρόγραμμα Java δείχνει τις διάφορες μεθόδους που αναφέραμε παραπάνω.
import java.util.*; public class Main { public static void main(String args()) { //create a linked list LinkedList l_list = new LinkedList(); // Add elements to linkedList using various add methods l_list.add('B'); l_list.add('C'); l_list.addLast('G'); l_list.addFirst('A'); l_list.add(3, 'D'); l_list.add('E'); l_list.add('F'); //print the linkedList System.out.println('Linked list : ' + l_list); //Create and initialize an ArrayList ArrayList aList = new ArrayList<>(); aList.add('H'); aList.add('I'); //add the ArrayList to linkedList using addAll method l_list.addAll(aList); //print the linkedList System.out.println('Linked list after adding ArrayList contents: ' + l_list); // use various remove methods to remove elements from linkedList l_list.remove('B'); l_list.remove(3); l_list.removeFirst(); l_list.removeLast(); //print the altered list System.out.println('Linked list after deletion: ' + l_list); // use contains method to check for an element in the linkedList boolean ret_value = l_list.contains('G'); //print the results of contains method if(ret_value) System.out.println('List contains the element 'G' '); else System.out.println('List doesn't contain the element 'G''); // use size methods to return Number of elements in the linked list int size = l_list.size(); System.out.println('Size of linked list = ' + size); // Get and set elements from linked list Object element = l_list.get(3); System.out.println('Element returned by get() : ' + element); l_list.set(3, 'J'); System.out.println('Linked list after change : ' + l_list); //convert linkedList to Array using toArray methods String () list_array = l_list.toArray(new String(l_list.size())); System.out.println('Array obtained from linked List:' + Arrays.toString(list_array)); } }
Παραγωγή:
Συνδεδεμένη λίστα: (A, B, C, D, G, E, F)
Συνδεδεμένη λίστα μετά την προσθήκη περιεχομένων ArrayList: (A, B, C, D, G, E, F, H, I)
Συνδεδεμένη λίστα μετά τη διαγραφή: (C, D, E, F, H)
Η λίστα δεν περιέχει το στοιχείο 'G'
Μέγεθος συνδεδεμένης λίστας = 5
Το στοιχείο επιστράφηκε με get (): F
Συνδεδεμένη λίστα μετά την αλλαγή: (C, D, E, J, H)
Σειρά που αποκτήθηκε από τη συνδεδεμένη λίστα: (C, D, E, J, H)

Το παραπάνω πρόγραμμα δείχνει διάφορες μεθόδους της τάξης LinkedList. Αρχικά, δηλώνουμε μια LinkedList τύπου String. Στη συνέχεια, χρησιμοποιούμε διάφορες εκδόσεις της μεθόδου προσθήκης, όπως add, and First, addLast, addAll κ.λπ. για να συμπληρώσουμε το LinkedList με τιμές.
Εδώ μπορούμε να προσθέσουμε το στοιχείο απευθείας στο τέλος της λίστας ή να προσθέσουμε το στοιχείο σε μια καθορισμένη θέση στη λίστα.
Χρησιμοποιούμε επίσης τη μέθοδο addFirst για να προσθέσουμε ένα στοιχείο στην αρχή της λίστας και το addLast για να προσθέσουμε ένα στοιχείο στο τέλος της λίστας. Στη συνέχεια, εκτελούμε λειτουργίες αφαίρεσης στο LinkedList όπως remove, removeFirst, removeLast κ.λπ.
Για τη μέθοδο κατάργησης, μπορούμε είτε να καθορίσουμε το στοιχείο που θα αφαιρεθεί είτε να καθορίσουμε το ευρετήριο ή τη θέση στο LinkedList στην οποία το στοιχείο πρόκειται να αφαιρεθεί. Οι μέθοδοι removeFirst και removeLast αφαιρέστε το πρώτο και τελευταίο στοιχείο στη λίστα αντίστοιχα.
Στη συνέχεια, αναζητούμε τη λίστα για ένα συγκεκριμένο στοιχείο χρησιμοποιώντας τη μέθοδο περιέχει. Στη συνέχεια, χρησιμοποιούμε τη μέθοδο size () για να ανακτήσουμε το μέγεθος ή το μήκος του LinkedList. Στη συνέχεια, χρησιμοποιούμε μεθόδους get / set για να ανακτήσουμε την τιμή σε ένα συγκεκριμένο ευρετήριο στη λίστα και στη συνέχεια να αντικαταστήσουμε μια τιμή σε μια καθορισμένη θέση στη λίστα.
Τέλος, μετατρέπουμε το LinkedList σε Array χρησιμοποιώντας τη μέθοδο toArray.
Αντίστροφη συνδεδεμένη λίστα στην Java
Για να αντιστρέψετε μια συνδεδεμένη λίστα στην Java, χρησιμοποιούμε τη μέθοδο 'descendingIterator ()' που επιστρέφει έναν αντίστροφο επαναληπτή για τη λίστα. Στη συνέχεια μπορούμε να χρησιμοποιήσουμε αυτόν τον επαναληπτικό για να διασχίσουμε τη λίστα και να εμφανίσουμε στοιχεία.
Το παρακάτω πρόγραμμα αντιστρέφει τη συνδεδεμένη λίστα χρησιμοποιώντας τη μέθοδο descendingIterator ().
import java.util.*; public class Main{ public static void main(String args()){ //create a LinkedList object LinkedList l_list=new LinkedList(); l_list.add('Pune'); l_list.add('Mumbai'); l_list.add('Nagpur'); System.out.println('Linked List : ' + l_list); System.out.println('Linked List in reverse order:'); //use descendingIterator method to get a reverse iterator Iterator iter=l_list.descendingIterator(); //traverse the list using iterator and print the elements. while(iter.hasNext()) { System.out.print(iter.next() + ' '); } } }
Παραγωγή:
Συνδεδεμένη λίστα: (Πούνε, Μουμπάι, Ναγκπούρ)
Συνδεδεμένη λίστα με αντίστροφη σειρά:
Ναγκπούρ Μουμπάι Πούνε

Στο παραπάνω πρόγραμμα, δηλώνουμε μια συνδεδεμένη λίστα και μετά την εκτυπώνουμε. Στη συνέχεια παίρνουμε έναν αντίστροφο επαναληπτικό και στη συνέχεια μπαίνουμε στη λίστα χρησιμοποιώντας τον και εμφανίζουμε κάθε στοιχείο. Η έξοδος εμφανίζει τα συνδεδεμένα περιεχόμενα λίστας, πρώτα με τη σειρά που προστίθενται τα στοιχεία και στη συνέχεια η έξοδος εμφανίζει τα περιεχόμενα με αντίστροφη σειρά.
Ταξινόμηση μιας συνδεδεμένης λίστας στην Java
Τα αντικείμενα κλάσης LinkedList μπορούν να ταξινομηθούν χρησιμοποιώντας τη μέθοδο Collections.sort (). Αυτή η μέθοδος παρέχει δύο εκδόσεις με ή χωρίς τη χρήση ενός συγκριτή. Όταν η μέθοδος Collections.sort () καλείται χωρίς συγκριτικό, η συλλογή ταξινομείται με τη φυσική σειρά.
Οταν ο συγκριτής χρησιμοποιείται με αυτήν τη μέθοδο, μπορούμε να ορίσουμε τα δικά μας κριτήρια ταξινόμησης παρακάμπτοντας τη μέθοδο σύγκρισης.
Το παρακάτω πρόγραμμα Java ταξινομεί ένα LinkedList χρησιμοποιώντας το Collections.sort (). Εδώ ταξινομούμε πίνακες χρησιμοποιώντας φυσική παραγγελία καθώς και χρησιμοποιώντας ένα συγκριτικό.
import java.util.*; public class Main{ public static void main(String args()) { // create and initialize the LinkedList object LinkedList l_list = new LinkedList<>(); l_list.add('Jan'); l_list.add('Feb'); l_list.add('Mar'); l_list.add('Apr'); l_list.add('May'); l_list.add('Jun'); //print original unsorted linkedlist System.out.println('Original LinkedList (unsorted): ' + l_list); // sort LinkedList with Collecitons.sort() method in natural order Collections.sort(l_list); System.out.println('
LinkedList (sorted in natural order): ' + l_list); // sort LinkedList using Collection.sort() and Comparator in Java Collections.sort(l_list, new Comparator() { @Override public int compare(String s1, String s2) { return s1.length() - s2.length(); } } ); System.out.println('LinkedList (sorted using Comparator): ' + l_list); } }
Παραγωγή:
Original LinkedList (χωρίς ταξινόμηση): (Ιαν, Φεβ, Μάρ, Απρ, Μάιο, Ιούνιο)
LinkedList (ταξινομημένο με φυσική σειρά): (Απρ, Φεβ, Ιαν, Ιούν, Μαρ, Μάιος)
LinkedList (ταξινόμηση με χρήση του Συγκριτή): (Απρ, Φεβ, Ιαν, Ιούν, Μάρ, Μάιος)

Κατάργηση διπλότυπων
Για να αφαιρέσετε διπλότυπα, πρέπει να διασχίσετε κάθε κόμβο και να το συγκρίνετε με τον επόμενο κόμβο. Εάν και οι δύο κόμβοι είναι οι ίδιοι, παραλείπουμε έναν κόμβο και προχωρούμε στον επόμενο.
Με αυτόν τον τρόπο, αφού διασχίσουμε κάθε κόμβο και απαλλαγούμε από διπλούς κόμβους, θα λάβουμε τη λίστα που προκύπτει χωρίς διπλά στοιχεία.
Δίνεται παρακάτω ένα πρόγραμμα Java για την αφαίρεση διπλών.
class LinkedList_Duplicate { //A class to represent node in linkedlist class Node{ int data; Node next; public Node(int data) { this.data = data; this.next = null; } } //Initially the head and tail of the linked list set to null public Node head = null; public Node tail = null; //add a new node to the linkedlist public void addNode(int data) { //Create new node Node newNode = new Node(data); //If list is empty set head and tail to new node if(head == null) { head = newNode; tail = newNode; } else { // add newNode after the tail tail.next = newNode; //newNode is now the tail or last element tail = newNode; } } //scans the linkedlist and removes duplicate nodes public void removeDuplicateNodes() { //Head is the current node Node current = head, index = null, temp = null; //head = null means list is empty if(head == null) { return; } //traverse through the list else { while(current != null){ //temp node points to previous node to index. temp = current; //Index will point to node next to current index = current.next; while(index != null) { //Check if current node's data is equal to index node's data if(current.data == index.data) { //since node is duplicate skip index and point to next node temp.next = index.next; } else { //Temp will point to previous node of index. temp = index; } index = index.next; } current = current.next; } } } //print the linked list public void print() { //Node current will point to head Node current = head; if(head == null) { System.out.println('List is empty'); return; } while(current != null) { //Print each node by incrementing pointer System.out.print(current.data + ' '); current = current.next; } System.out.println(); } }class Main{ public static void main(String() args) { LinkedList_Duplicate l_List = new LinkedList_Duplicate(); //Add data to the list l_List.addNode(1); l_List.addNode(1); l_List.addNode(2); l_List.addNode(3); l_List.addNode(5); l_List.addNode(2); l_List.addNode(1); l_List.addNode(1); //print the original list System.out.println('Original Linkedlist: '); l_List.print(); //Removes duplicate nodes l_List.removeDuplicateNodes(); //print the altered list without duplicates System.out.println('LinkedList after removing duplicates: '); l_List.print(); } }
Παραγωγή:
πώς να δημιουργήσετε έργο σε έκλειψη
Αρχική συνδεδεμένη λίστα:
1 1 2 3 5 2 1 1
LinkedList μετά την κατάργηση διπλότυπων:
1 2 3 5

Στο παραπάνω πρόγραμμα, έχουμε δημιουργήσει μια κλάση συνδεδεμένων λιστών για την κατάργηση διπλότυπων. Έχουμε επίσης μια τάξη για να ορίσουμε κάθε κόμβο. Με άλλα λόγια, οι κόμβοι στη λίστα είναι τα αντικείμενα αυτού του κόμβου κλάσης. Έχουμε μια μέθοδο για να προσθέσουμε τον κόμβο σε μια συνδεδεμένη λίστα.
Στη συνέχεια, στη μέθοδο removeDuplicate, διασχίζουμε κάθε κόμβο στη συνδεδεμένη λίστα ξεκινώντας από την κεφαλή και συγκρίνουμε κάθε επόμενο κόμβο για το αντίγραφο. Εάν βρεθεί ένα αντίγραφο, παραλείπουμε αυτόν τον κόμβο και συνεχίζουμε στον επόμενο κόμβο.
Με αυτόν τον τρόπο το ist δημιουργείται παραλείποντας τους διπλούς κόμβους και η αλλαγμένη λίστα εκτυπώνεται χρησιμοποιώντας τη μέθοδο εκτύπωσης ().
Κυκλική συνδεδεμένη λίστα στην Java
Μια κυκλική συνδεδεμένη λίστα είναι μια λίστα που έχει την ουρά ή τον τελευταίο κόμβο συνδεδεμένο πίσω στην κεφαλή ή στον πρώτο κόμβο.
Το παρακάτω διάγραμμα δείχνει την κυκλική συνδεδεμένη λίστα σε Java.

Όπως φαίνεται στο παραπάνω διάγραμμα, το τμήμα διεύθυνσης του τελευταίου κόμβου ή της ουράς της συνδεδεμένης λίστας δεν έχει οριστεί σε μηδέν. Αντ 'αυτού, δείχνει πίσω στον πρώτο κόμβο ή στην κεφαλή της λίστας σχηματίζοντας έτσι μια κυκλική συνδεδεμένη λίστα.
Το παρακάτω πρόγραμμα εφαρμόζει μια κυκλική συνδεδεμένη λίστα όπου πρέπει να χειριστούμε μεμονωμένους κόμβους της συνδεδεμένης λίστας.
class CircularLinkedList { //Node definition for circular linked list public class Node{ int data; Node next; public Node(int data) { this.data = data; } } //Initially head and tail pointers point to null public Node head = null; public Node tail = null; //add new node to the circular linked list public void add(int data){ //Create new node Node newNode = new Node(data); //check if list is empty if(head == null) { //head and tail point to same node if list is empty head = newNode; tail = newNode; newNode.next = head; } else { //tail points to new node if list is not empty tail.next = newNode; //New node becomes new tail. tail = newNode; //tail points back to head tail.next = head; } } //Display the nodes in circular linked list public void displayList() { Node current = head; if(head == null) { System.out.println('The List is empty'); } else { System.out.println('Circular linked list nodes: '); do{ //Print each node of the linked list System.out.print(current.data + ' '); current = current.next; }while(current != head); System.out.println(); } } } class Main{ public static void main(String() args) { //create a CircularLinkedList object CircularLinkedList c_list = new CircularLinkedList(); //Add data to the list c_list.add(10); c_list.add(20); c_list.add(30); c_list.add(40); //Display the nodes in circular linked list c_list.displayList(); } }
Παραγωγή:
Κυκλικοί συνδεδεμένοι κόμβοι λίστας:
10 20 30 40

Java 8 LinkedList
Αν και δεν υπάρχουν άλλες δυνατότητες που προστέθηκαν ειδικά στην κατηγορία LinkedList στην Java 8, εισήγαγε ακόμα ροές για χειρισμό δεδομένων.
Το παρακάτω πρόγραμμα δείχνει τη χρήση της ροής Java 8 για την προβολή LinkedList.
import java.util.LinkedList; import java.util.List; public class Main { public static void main(String() args) { //create a LinkedList and initialize it to values List colorsList = new LinkedList<>(); colorsList.add('Red'); colorsList.add('Green'); colorsList.add('Blue'); colorsList.add('Cyan'); colorsList.add('Magenta'); //convert List to stream & print it System.out.println('The contents of LinkedList:'); colorsList.stream().forEach(System.out::println); } }
Παραγωγή:
Τα περιεχόμενα του LinkedList:
Καθαρά
Πράσινος
Μπλε
Κυανό
Πορφύρα βαφή

Συχνές Ερωτήσεις
Ε # 1) Πότε χρησιμοποιείται η συνδεδεμένη λίστα στην Java;
Απάντηση: Καθώς είναι ταχύτερη από τις συλλογές όπως το ArrayList σε λειτουργίες τροποποίησης, θα πρέπει να χρησιμοποιείται σε εφαρμογές που απαιτούν συχνές εργασίες προσθήκης / διαγραφής. Για εφαρμογές που έχουν ως επί το πλείστον δεδομένα μόνο για ανάγνωση, μπορούν να χρησιμοποιηθούν ArrayList ή παρόμοιες συλλογές.
Ε # 2) Τι είναι το ListNode;
Απάντηση: Το ListNode είναι μια βασική κλάση που σχετίζεται με μια συνδεδεμένη λίστα στην Java και αντιπροσωπεύει πληροφορίες που σχετίζονται με ένα μόνο στοιχείο ή έναν κόμβο. Κάθε ListNode αποτελείται από δεδομένα και δείκτη ή αναφορά στο επόμενο στοιχείο.
Q # 3) Η συνδεδεμένη λίστα επιτρέπει μηδενικές τιμές;
Απάντηση: Ναι, η συνδεδεμένη λίστα επιτρέπει οποιονδήποτε αριθμό μηδενικών τιμών.
Q # 4) Ποια είναι τα πλεονεκτήματα μιας συνδεδεμένης λίστας;
Απάντηση: Μερικά από τα πλεονεκτήματα είναι:
- Οι χειρισμοί όπως η προσθήκη, η διαγραφή είναι ταχύτερες σε αυτό.
- Δεν χρειάζεται να εκχωρήσετε εκ των προτέρων τη μνήμη για μια συνδεδεμένη λίστα και έτσι οδηγεί σε αποτελεσματική χρήση της μνήμης.
- Παρέχει γρηγορότερο χρόνο πρόσβασης και χωρίς επιπλέον επιβάρυνση για τη μνήμη και μπορεί να επεκταθεί σε σταθερό χρόνο.
- Είναι μια δυναμική δομή δεδομένων
- Αυξάνεται και συρρικνώνεται στο χρόνο εκτέλεσης ανάλογα με τις τιμές που προστίθενται ή διαγράφονται.
Q # 5) Ποια είναι η εφαρμογή της συνδεδεμένης λίστας;
Απάντηση: Χρησιμοποιείται κυρίως στις ακόλουθες εφαρμογές:
- Για να εφαρμόσετε τη λειτουργία «αναίρεσης» σε λογισμικό όπως το MS-Word, το Photoshop κ.λπ.
- Για την εφαρμογή δομών δεδομένων όπως στοίβα και ουρά.
- Μπορούμε επίσης να εφαρμόσουμε γραφήματα χρησιμοποιώντας μια συνδεδεμένη λίστα.
- Για κατακερματισμό κάδου, κάθε κάδος μπορεί να εφαρμοστεί ως συνδεδεμένη λίστα.
Q # 6) Ποιοι είναι οι περιορισμοί μιας συνδεδεμένης λίστας;
Απάντηση: Μερικοί από τους περιορισμούς είναι:
- Με έναν επιπλέον δείκτη για να διατηρεί την αναφορά του επόμενου στοιχείου σε κάθε κόμβο, η μνήμη που χρησιμοποιείται είναι πολύ περισσότερο από πίνακες.
- Αυτή είναι μια δομή δεδομένων με αυστηρά διαδοχική πρόσβαση, επομένως οι κόμβοι της συνδεδεμένης λίστας πρέπει πάντα να διαβάζονται από την αρχή.
- Είναι δύσκολο να το διασχίσουμε προς τα πίσω, ειδικά οι λίστες που συνδέονται μόνοι.
- Δεδομένου ότι οι κόμβοι αποθηκεύονται σε μη γειτονικές τοποθεσίες, ο χρόνος που απαιτείται για την πρόσβαση μπορεί να είναι υψηλός.
συμπέρασμα
Σε αυτό το σεμινάριο, μάθαμε τη βασική δομή δεδομένων συνδεδεμένων λιστών. Στη συνέχεια προχωρήσαμε στην τάξη java.util.LinkedList που παρέχεται στην Java. Συζητήσαμε λεπτομερώς αυτήν την τάξη, συμπεριλαμβανομένων των κατασκευαστών, των μεθόδων κ.λπ.
Συζητήσαμε επίσης ορισμένες ειδικές λειτουργίες που σχετίζονται με Συνδεδεμένες λίστες, όπως ταξινόμηση, αντιστροφή λίστας, αφαίρεση διπλών, κυκλική συνδεδεμένη λίστα κ.λπ.
Στο επόμενο σεμινάριό μας, θα συζητήσουμε συγκεκριμένα χαρακτηριστικά της λίστας με διπλή σύνδεση.
=> Δείτε τον Πλήρες οδηγό εκπαίδευσης Java εδώ.
Συνιστώμενη ανάγνωση
- Διπλά συνδεδεμένη λίστα στην Java - Παραδείγματα υλοποίησης και κώδικα
- Λίστα Java - Τρόπος δημιουργίας, αρχικοποίησης και χρήσης λίστας στην Java
- Μέθοδοι λίστας Java - Ταξινόμηση λίστας, περιέχει, προσθήκη λίστας, κατάργηση λίστας
- Binary Search Algorithm In Java - Εφαρμογή & παραδείγματα
- Ταξινόμηση εισαγωγής σε Java - Αλγόριθμος ταξινόμησης εισαγωγής και παραδείγματα
- Java Interface και Abstract Class Tutorial με παραδείγματα
- Δομή δεδομένων συνδεδεμένης λίστας σε C ++ με απεικόνιση
- Κρυφή λίστα για συστοιχία και άλλες συλλογές στην Java