doubly linked list java implementation code examples
Tento výukový program vysvětluje Doubly Linked List v Javě spolu s implementací Double Double List, Circular Doubly Linked List Java Code a příklady:
Propojený seznam je sekvenční reprezentací prvků. Každý prvek propojeného seznamu se nazývá „uzel“. Jeden typ propojeného seznamu se nazývá „Singly linked list“.
V tomto každý uzel obsahuje datovou část, která ukládá skutečná data, a druhou část, která ukládá ukazatel na další uzel v seznamu. Podrobnosti o jednotlivě propojeném seznamu jsme se již naučili v našem předchozím tutoriálu.
=> Zkontrolujte VŠECHNY výukové programy Java zde.
Co se naučíte:
Dvojnásobně propojený seznam v Javě
Propojený seznam má další variantu nazvanou „dvojnásobně propojený seznam“. Dvojitě propojený seznam má ve svém uzlu další ukazatel známý jako předchozí ukazatel kromě datové části a další ukazatel jako v jednotlivě propojeném seznamu.
Uzel v dvojnásobně propojeném seznamu vypadá následovně:
jak najít klíč zabezpečení sítě na routeru
Zde jsou „Předchozí“ a „Další“ ukazatele na předchozí a další prvky uzlu. „Data“ jsou skutečný prvek, který je uložen v uzlu.
Následující obrázek ukazuje dvojnásobně propojený seznam.
Výše uvedený diagram ukazuje dvojnásobně propojený seznam. V tomto seznamu jsou čtyři uzly. Jak vidíte, předchozí ukazatel prvního uzlu a další ukazatel posledního uzlu je nastaven na null. Předchozí ukazatel nastavený na null označuje, že se jedná o první uzel v dvojnásobně propojeném seznamu, zatímco další ukazatel nastavený na null označuje, že uzel je posledním uzlem.
Výhody
- Protože každý uzel má ukazatele směřující na předchozí a další uzly, lze dvojitě propojený seznam snadno procházet dopředu i dozadu
- Nový uzel můžete rychle přidat pouhou změnou ukazatelů.
- Podobně pro operaci mazání, protože máme předchozí i další ukazatele, je mazání jednodušší a nemusíme procházet celý seznam, abychom našli předchozí uzel, jako v případě jednotlivě propojeného seznamu.
Nevýhody
- Vzhledem k tomu, že v seznamu, který je dvojnásobně propojen, tj. V předchozím ukazateli, je další ukazatel, je k uložení tohoto ukazatele spolu s dalším ukazatelem a datovou položkou zapotřebí další paměťový prostor.
- Všechny operace, jako je přidání, odstranění atd., Vyžadují manipulaci s předchozím i následujícím ukazatelem, čímž se ukládá provozní režie.
Implementace v Javě
Implementace seznamu s dvojitým propojením v Javě zahrnuje vytvoření třídy s dvojitým spojením, třídy uzlu a přidání uzlů do seznamu s dvojitým spojením
Přidání nových uzlů se obvykle provádí na konci seznamu. Níže uvedený diagram ukazuje přidání nového uzlu na konec dvojitě propojeného seznamu.
Jak je znázorněno ve výše uvedeném diagramu, pro přidání nového uzlu na konec seznamu ukazuje další ukazatel posledního uzlu na nový uzel namísto null. Předchozí ukazatel nového uzlu ukazuje na poslední uzel. Další ukazatel nového uzlu také ukazuje na null, čímž se stává novým posledním uzlem.
Níže uvedený program ukazuje implementaci seznamu dvojnásobně propojeného jazyka Java s přidáním nových uzlů na konci seznamu.
class DoublyLinkedList { //A node class for doubly linked list class Node{ int item; Node previous; Node next; public Node(int item) { this.item = item; } } //Initially, heade and tail is set to null Node head, tail = null; //add a node to the list public void addNode(int item) { //Create a new node Node newNode = new Node(item); //if list is empty, head and tail points to newNode if(head == null) { head = tail = newNode; //head's previous will be null head.previous = null; //tail's next will be null tail.next = null; } else { //add newNode to the end of list. tail->next set to newNode tail.next = newNode; //newNode->previous set to tail newNode.previous = tail; //newNode becomes new tail tail = newNode; //tail's next point to null tail.next = null; } } //print all the nodes of doubly linked list public void printNodes() { //Node current will point to head Node current = head; if(head == null) { System.out.println('Doubly linked list is empty'); return; } System.out.println('Nodes of doubly linked list: '); while(current != null) { //Print each node and then go to next. System.out.print(current.item + ' '); current = current.next; } } } class Main{ public static void main(String[] args) { //create a DoublyLinkedList object DoublyLinkedList dl_List = new DoublyLinkedList(); //Add nodes to the list dl_List.addNode(10); dl_List.addNode(20); dl_List.addNode(30); dl_List.addNode(40); dl_List.addNode(50); //print the nodes of DoublyLinkedList dl_List.printNodes(); } }
Výstup:
Uzly dvojnásobně propojeného seznamu:
10 20 30 40 50
Kromě přidání nového uzlu na konec seznamu můžete také přidat nový uzel na začátek seznamu nebo mezi seznam. Tuto implementaci necháme na čtenáři, aby čtenáři mohli operacím lépe porozumět.
Kruhový dvojnásobně propojený seznam v Javě
Kruhový dvojitě propojený seznam je jednou ze složitých struktur. V tomto seznamu obsahuje poslední uzel dvojnásobně propojeného seznamu adresu prvního uzlu a první uzel obsahuje adresu posledního uzlu. V kruhovém seznamu s dvojnásobným propojením tedy existuje cyklus a žádný z ukazatelů uzlu není nastaven na null.
Následující diagram ukazuje kruhový dvojitě propojený seznam.
Jak ukazuje výše uvedený diagram, další ukazatel posledního uzlu ukazuje na první uzel. Předchozí ukazatel prvního uzlu ukazuje na poslední uzel.
Kruhové dvojnásobně propojené seznamy mají široké uplatnění v softwarovém průmyslu. Jednou z takových aplikací je hudební aplikace se seznamem skladeb. Když v seznamu skladeb dokončíte přehrávání všech skladeb, na konci poslední skladby se automaticky vrátíte na první skladbu. To se provádí pomocí kruhových seznamů.
Výhody kruhového seznamu s dvojitým propojením:
- Kruhový dvojitě propojený seznam lze procházet od hlavy k ocasu nebo od ocasu k hlavě.
- Přechod od hlavy k ocasu nebo ocasu k hlavě je efektivní a trvá jen konstantní čas O (1).
- Může být použit pro implementaci pokročilých datových struktur včetně haldy Fibonacci.
Nevýhody:
- Protože každý uzel potřebuje uvolnit místo pro předchozí ukazatel, je vyžadována další paměť.
- Musíme se vypořádat se spoustou ukazatelů při provádění operací na kruhovém dvojitě spojeném seznamu. Pokud ukazatele nejsou zpracovány správně, může dojít k přerušení implementace.
Níže uvedený program Java ukazuje implementaci seznamu Circular dvojnásobně propojeného.
import java.util.*; class Main{ static Node head; // Doubly linked list node definition static class Node{ int data; Node next; Node prev; }; // Function to insert node in the list static void addNode(int value) { // List is empty so create a single node furst if (head == null) { Node new_node = new Node(); new_node.data = value; new_node.next = new_node.prev = new_node; head = new_node; return; } // find last node in the list if list is not empty Node last = (head).prev; //previous of head is the last node // create a new node Node new_node = new Node(); new_node.data = value; // next of new_node will point to head since list is circular new_node.next = head; // similarly previous of head will be new_node (head).prev = new_node; // change new_node=>prev to last new_node.prev = last; // Make new node next of old last last.next = new_node; } static void printNodes() { Node temp = head; //traverse in forward direction starting from head to print the list while (temp.next != head) { System.out.printf('%d ', temp.data); temp = temp.next; } System.out.printf('%d ', temp.data); //traverse in backward direction starting from last node System.out.printf('
Circular doubly linked list travesed backward:
'); Node last = head.prev; temp = last; while (temp.prev != last) { System.out.printf('%d ', temp.data); temp = temp.prev; } System.out.printf('%d ', temp.data); } public static void main(String[] args) { //the empty list Node l_list = null; // add nodes to the list addNode(40); addNode(50); addNode(60); addNode(70); addNode(80); //print the list System.out.printf('Circular doubly linked list: '); printNodes(); } }
Výstup:
Kruhový dvojitě propojený seznam: 40 50 60 70 80
Kruhový dvojitě propojený seznam cestoval dozadu:
80 70 60 50 40
Ve výše uvedeném programu jsme přidali uzel na konec seznamu. Protože je seznam kruhový, po přidání nového uzlu bude další ukazatel nového uzlu ukazovat na první uzel a předchozí ukazatel prvního uzlu bude ukazovat na nový uzel.
Podobně bude předchozí ukazatel nového uzlu ukazovat na aktuální poslední uzel, který se nyní stane druhým posledním uzlem. Implementaci přidání nového uzlu necháme na začátku seznamu a mezi uzly čtenářům.
Často kladené otázky
Otázka č. 1) Může být seznam s dvojím propojením kruhový?
Odpovědět: Ano. Jedná se o složitější datovou strukturu. V kruhovém seznamu s dvojitým propojením obsahuje předchozí ukazatel prvního uzlu adresu posledního uzlu a další ukazatel posledního uzlu obsahuje adresu prvního uzlu.
Otázka č. 2) Jak vytvoříte seznam s dvojitým kruhovým propojením?
Odpovědět: Můžete vytvořit třídu pro dvojnásobně kruhový propojený seznam. Uvnitř této třídy bude statická třída představující uzel. Každý uzel bude obsahovat dva ukazatele - předchozí a následující a datovou položku. Pak můžete provést operace pro přidání uzlů do seznamu a procházení seznamu.
Otázka č. 3) Je seznam s dvojnásobným propojením lineární nebo kruhový?
Odpovědět: Seznam s dvojitým spojením je lineární struktura, ale kruhový seznam s dvojitým spojením, jehož ocas směřuje k hlavě a hlava směřuje k ocasu. Proto je to kruhový seznam.
Otázka č. 4) Jaký je rozdíl mezi seznamem Doubly linked a Circular linked list?
Odpovědět: Dvojitě propojený seznam má uzly, které uchovávají informace o svých předchozích i dalších uzlech pomocí předchozího a následujícího ukazatele. Také předchozí ukazatel prvního uzlu a další ukazatel posledního uzlu je nastaven na null v dvojnásobně propojeném seznamu.
jaký je rozdíl mezi qa a qc
V kruhovém propojeném seznamu nejsou žádné počáteční ani koncové uzly a uzly tvoří cyklus. Žádný z ukazatelů není v kruhovém propojeném seznamu nastaven na hodnotu null.
Otázka č. 5) Jaké jsou výhody nepochybně propojeného seznamu?
Odpovědět: Výhody dvojitě propojeného seznamu jsou:
- Lze jím procházet dopředu i dozadu.
- Operace vložení je jednodušší, protože nemusíme procházet celým seznamem, abychom našli předchozí prvek.
- Odstranění je efektivní, protože víme, že předchozí a následující uzly a manipulace je jednodušší.
Závěr
V tomto tutoriálu jsme podrobně diskutovali seznam Doubly linked v Javě. Dvojitě propojený seznam je složitá struktura, kde každý uzel obsahuje ukazatele na jeho předchozí i následující uzly. Správa těchto odkazů je někdy obtížná a může vést k rozpadu kódu, pokud nebude správně zpracována.
Celkově jsou operace dvojnásobně propojeného seznamu efektivnější, protože můžeme ušetřit čas pro procházení seznamu, protože máme předchozí i následující ukazatele.
Kruhový dvojnásobně propojený seznam je složitější a tvoří kruhový vzor s předchozím ukazatelem prvního uzlu směřujícím k poslednímu uzlu a dalším ukazatelem posledního uzlu směřujícím k prvnímu uzlu. V tomto případě jsou také operace efektivní.
Tím jsme hotovi s propojeným seznamem v Javě. Zůstaňte naladěni na mnoho dalších tutoriálů o technikách vyhledávání a řazení v Javě.
=> Navštivte zde exkluzivní sérii výukových programů Java.
Doporučené čtení
- Dvojnásobně propojená datová struktura seznamu v C ++ s ilustrací
- Algoritmus binárního vyhledávání v Javě - implementace a příklady
- Seznam Java - Jak vytvořit, inicializovat a používat seznam v Javě
- Výukový program pro rozhraní Java a abstraktní třídu s příklady
- Metody seznamu Java - Řazení seznamu, Obsahuje, Přidat seznam, Seznam odebrat
- Insertion Sort In Java - Alserith Sort Algorithm & examples
- Výukový program JAVA pro začátečníky: 100+ praktických výukových programů Java Video
- Bubble Sort In Java - Algoritmy třídění Java a příklady kódu