You are on page 1of 10

Listat e lidhura

Listat e Lidhura një-drejtimore


Paraqitja vizuale

Pyetje teorike
1. Çfarë është një listë e lidhur një-drejtimore? Cilët janë elementët përbërës të saj? Çfarë
përmban secila nyje?
2. Cilat janë disa avantazhe dhe disavantazhe të përdorimit të një liste të lidhur një-drejtimore
në krahasim me vektorët (arrays)?

Implementimi në Java
Klasat që duhet të implementojmë për të përcaktuar strukturën e një liste të lidhur një-
drejtimore janë:

1. ListNode -> nyja e listës


2. LinkedListIterator ->përcaktimi i një pozicioni në listë
3. LinkedList -> implementimi i metodave të ndryshme të lidhura me listen

Klasa ListNode

• Përcaktimi i nyjes së listës me një generic type <AnyType>


• Çdo nyje ka dy variabla instance: vlera e elementit që do të ruhet në të dhe referenca në
nyjen next
• Konstruktorët:
o Mund të krijojmë një konstruktor që merr vetëm një vlerë të elementit, dhe
automatikisht referenca next do të jetë null;
o Mund të krijojmë një konstruktor të dytë që merr edhe vleren e elementit edhe
referencën next si parametra.

Klasa LinkedListIterator

• Variabla instance: një nyje current që mban pozicionin aktual ku jemi


• Konstruktori: merr si parameter një nyje dhe përcakton pozicionin aktual në këtë nyje
• Metodat:
o public boolean isValid() -> kontrollon nëse ekziston ky pozicion apo eshte null;
o public AnyType retrieve() -> akseson vlerën e ruajtur në këtë pozicion
o public void advance() -> kalon në pozicionin e rradhës

Klasa LinkedList

• Variabla instance: një nyje header që referon nisjen e listës


• Konstruktori: Inicializon vlerën e header me null
• Metodat:
o public boolean isEmpty() -> kontrollon nëse lista është bosh apo jo; Lista është bosh
nëse nuk ka nyje pas header;
o public void makeEmpty() -> një metodë që e kthen listen në boshe
o public LinkedListIterator<AnyType> zeroth() -> Kthen një iterator në headerin e
listes që ndodhet në pozicionin zero
o public LinkedListIterator<AnyType> first() -> Kthen një iterator në elementin e
pare të listes
o public LinkedListIterator<AnyType> find (AnyType x) -> Gjen nëse një element
me vlerë x gjendet në listë dhe kthen një iterator në pozicionin ku ndodhet elementi.
Kontrollohen të gjithë elementët me rradhë nga header në fund.
o public LinkedListIterator<AnyType> findPrevious (AnyType x) -> Gjen
elementin që ndodhet përpara një elementi X.
o public static <AnyType> void printList(LinkedList<AnyType> list) -> Printon të
gjithë elementët e listës; nëse lista është boshe printon mesazh. Iterojme nga nyja first
me metodën advance të LinkedListIterator.
o public void insert(AnyType x, LinkedListIterator<AnyType> p) -> Shton një nyje
në një pozicion të caktuar në listë. Kontrolloni nëse pozicioni dhe iteratori nuk janë
null dhe krijoni një nyje next
o public void remove(AnyType x) -> Fshin një element x nga lista. Për të fshirë një
element duhet të dijmë pozicionin e elementit paraardhës. Nëse elementi që do të
fshihet ekziston, atëherë elementi paraardhës do të drejtojë dy nyje me tutje.
Implementimi në Java

ListNode.java

public class ListNode<AnyType extends Comparable>{


public AnyType element;
public ListNode<AnyType> next;

public ListNode(AnyType element)


{
this.element=element;
this.next=null;
}

public ListNode(AnyType e, ListNode<AnyType> n)


{
this.element=e;
this.next=n;
}
}

LinkedListIterator.java

package LinkedList;

public class LinkedListIterator<AnyType extends Comparable<?>> {

ListNode<AnyType> current; //percakton pozicionin aktual

public LinkedListIterator ()
{
current=null;
}
public LinkedListIterator (ListNode<AnyType> node)
{
current=node;
}

public boolean isValid()


{
return current!=null;
}

public AnyType retrieve()


{
if(isValid())
{
return current.element;
}
else
{
return null;
}
}

public void advance()


{
if(isValid())
{
current=current.next;
}
}
}

LinkedList.java

public class LinkedList<AnyType extends Comparable<AnyType>>{

private ListNode<AnyType> header;

public LinkedList()
{
header=new ListNode<AnyType>(null);
}
public boolean isEmpty()
{
return header.next==null;
}
public void makeEmpty()
{
header.next=null;
}

public LinkedListIterator<AnyType> zeroth()


{
return new LinkedListIterator<AnyType>(header);
}
public LinkedListIterator<AnyType> first()
{
return new LinkedListIterator<AnyType>(header.next);
}

public void insert(AnyType x, LinkedListIterator<AnyType> p)


{
if(p!=null && p.current!=null)
{
p.current.next=new ListNode<AnyType>(x,p.current.next);
}

public LinkedListIterator<AnyType> find (AnyType x)


{
ListNode<AnyType> node=header.next;
while(node!=null && !node.element.equals(x))
{
node=node.next;
}

LinkedListIterator<AnyType> itr=new
LinkedListIterator<AnyType>(node);
return itr;
}

public LinkedListIterator<AnyType> findPrevious (AnyType x)


{
ListNode<AnyType> itr=header;

while(itr.next!=null && !itr.next.element.equals(x))


{
itr=itr.next;
}
LinkedListIterator<AnyType> i=new
LinkedListIterator<AnyType>(itr);
return i;
}

public void remove(AnyType x)


{
LinkedListIterator<AnyType> itr=findPrevious(x);

if(itr.current.next!=null)
{
itr.current.next=itr.current.next.next;
}
}

public static <AnyType> void printList(LinkedList<?> list)


{
if(list.isEmpty())
{
System.out.println("lista eshte bosh");
}
else
{
LinkedListIterator<?> itr=list.first();
for( ; itr.isValid(); itr.advance())
{
System.out.print(itr.retrieve()+" ");
}

}
System.out.println();
}
}
Listat e Lidhura dy-drejtimore
Paraqitja vizuale

Implementimi është i ngjashëm me listat një-drejtimore, por në këtë rast shtohet referenca
previous për çdo nyje, si edhe një nyje në fund trailer që tregon fundin e listës.

Implementimi në Java

DoublyListNode.java
public class DoublyListNode<AnyType extends Comparable<?>> {

public AnyType element;


public DoublyListNode<AnyType> next;
public DoublyListNode<AnyType> prev;

public DoublyListNode(AnyType element)


{
this.element=element;
this.next=null;
this.prev=null;
}

public DoublyListNode(AnyType e, DoublyListNode<AnyType>


n,DoublyListNode<AnyType> p)
{
this.element=e;
this.next=n;
this.prev=p;
}
}

DoublyLinkedListIterator.java
package DoublyLinkedList;

public class DoublyLinkedListIterator<AnyType extends Comparable<?>> {

DoublyListNode<AnyType> current; //percakton pozicionin


aktual

public DoublyLinkedListIterator ()
{
current=null;
}
public DoublyLinkedListIterator (DoublyListNode<AnyType> node)
{
current=node;
}

public boolean isValid()


{
return current!=null;
}

public AnyType retrieve()


{
if(isValid())
{
return current.element;
}
else
{
return null;
}
}

public void advance()


{
if(isValid())
{
current=current.next;
}
}

public void previous()


{
if(isValid())
{
current=current.prev;
}
}

DoublyLinkedList.java

public class DoublyLinkedList<AnyType extends Comparable<?>> {

private DoublyListNode<AnyType> header;


private DoublyListNode<AnyType> trailer;

public DoublyLinkedList()
{
header=new DoublyListNode<AnyType>(null);
trailer=new DoublyListNode<AnyType>(null);
header.next=trailer;
trailer.prev=header;
}

public void printList() {


if (header.next == trailer)
System.out.print("Empty list");
else {
DoublyListNode<AnyType> itr = header.next;
while (itr != trailer) {
System.out.print(itr.element + " ");
itr = itr.next;
}
}
System.out.println();
}
public void shtoNeFund(AnyType n) {
DoublyListNode<AnyType> new_node= new DoublyListNode<AnyType>(n,
trailer, null);
trailer.prev.next=new_node;
new_node.prev=trailer.prev;
trailer.prev=new_node;
}
}

Listat e Lidhura rrethore

Listë një-drejtimore rrethore

Listë dy-drejtimore rrethore


Ushtrime

1. Ndertoni nje funksion qe kthen shumen e elementeve ne nje liste te lidhur njedrejtimore.

2. Ndertoni nje funksion qe llogarit dhe kthen gjatesine e nje liste te lidhur njedrejtimore.

3. Ndertoni nje funksion qe merr nje numer te plote k dhe kthen vleren e nyjes se k-te te nje
liste te lidhur njedrejtimore nqs ajo eksiston.

4. Nje funksion duhet te gjeje dhe te fshije nyjen me vlere k nga nje liste. (Provoni ta zgjidhni
pa perdorur iterator, vetëm duke kaluar nga një nyje në tjetrën)

5. Ndertoni nje funksion qe shton ne nje liste te lidhur njedrejtimore nje nyje me vlere k ne
pozicionin e j-te ne liste. (j eshte numer i plote).

6. Ndertoni nje funksion qe merr dy pozicione ne nje liste te lidhur njedrejtimore dhe kthen
numrin e elementeve midis tyre.

7. Ndertoni nje funksion qe zhvendos maksimumin ne fillim te listes dhe minimumin ne fund
te listes se lidhur njedrejtimore.

8. Ndertoni nje funksion qe fshin nga lista e lidhur njedrejtimore L te gjithe elementet qe
ndodhen ne nje liste te dyte njedrejtimore P.
a. Lista L dhe lista P jane te parenditura
b. Lista L dhe lista P jane te renditura ne rend rrites.

9. Ndertoni nje funksion qe kthen mbrapsht nje liste te lidhur njedrejtimore pa perdorur liste
te re. Lista eshte:
a. njedrejtimore.
b. dydrejtimore
c. njedrejtimore rrethore
d. dydrejtimore rrethore
public void inverto() {
ListNode<AnyType>
aktual=header.next;
ListNode<AnyType> para=
null, pas;
while(aktual!=null) {
pas=aktual.next;
aktual.next=para;
para=aktual;
aktual=pas;
}
header.next=para;
}

10. Ndertoni nje funksion qe kthen true nqs nje liste e lidhur eshte palindrome dhe false ne te
kundert. Lista eshte:
a. njedrejtimore.
b. dydrejtimore
c. njedrejtimore rrethore
d. dydrejtimore rrethore

11. Ndertoni nje funksion qe shton nje element ne nje liste te lidhur te renditur pa prishur
renditjen. Lista eshte:
a. njedrejtimore.
b. dydrejtimore
c. njedrejtimore rrethore
d. dydrejtimore rrethore

12. Shkruani funksionin qe nderron vendet e dy elementeve fqinje ne liste. Lista eshte:
a. e lidhur nje drejtimore
b. lidhur dy drejtimore

13. Ndertoni nje funksion qe konverton nje liste te lidhur njedrejtimore ne nje liste te lidhur
njedrejtimore rrethore.

14. Në kodin e DoublyLinkedList implementoni një metodë shtonëfund që shton nyje te reja
në fund të listës.

You might also like