linkedlist - unojaime/courses/2125/linkedlists.pdf · may 2004 public class linkedlist extends...

13
May 2004 Structure built from collection of nodes that reference each other. A node contains reference to a list element, one or more variables referencing other structure nodes. May 2004 LinkedList: Each node references node containing next list element. node A B C D May 2004 Class Node, local to LinkedList, models nodes. Node structure: must know an element of the List, must know the next Node in sequence. As local class of LinkedList has no methods.

Upload: nguyennhu

Post on 08-Apr-2019

219 views

Category:

Documents


0 download

TRANSCRIPT

� � � � � � � � � � � � � �� � � � � � � � � � � � � � � �

� � � � � � � � � � � � � � � � � � � � � � � � � � � � ! " # � $ $ %

& ' ( ) * + ( , -. / * 0 * / ( 1 2 3 - 4 1 5

6 5 ' 7 8 * / 9 :; ) 7 < * ) * = 8 ( = > < ( 4 8 4 ? @ ( = 2 * 0 ( ) 7 < * ) * = 8 ' 8 ( - = 4

AMay 2004 B C D E F G H I J K L M

N O P Q R S O T U V R T R P W X W O Y P Z

[Structure built from collection of nodes that reference each other. [A node \

contains reference to a list element, \one or more variables referencing other structure nodes.

]May 2004 B C D E F G H I J K L M

^ O _ Z W V O P Q R S O T U V R T R P W X W O Y P

[LinkedList: Each node references node containing next list element.

node

A B C D

`May 2004 B C D E F G H I J K L M

a V X Z Z b Y S R

[Class Node, local to LinkedList, models nodes. [Node structure: \

must know an element of the List, \must know the next Node in sequence. [

As local class of LinkedList has no methods.

�May 2004 � � � � � � � � �

� � � � � � � � � � � � � � � � � � � � � � �

public class LinkedList<Element> extends AbstractList<Element> {

…private class Node {

private Element element;private Node next;

// Create a Node containing the specified element.public Node (Element element) {

this.element = element;this.next = null;

}} // end of class Node

} // end of class LinkedList

�May 2004 � � � � � � � � �

� � � � � � � � � � � � � � � � � � � � � � � �

public class LinkedList<Element> extends AbstractList<Element> {

private int size;private Node first;

// Create an empty LinkedList<Element>.public LinkedList () {

size = 0;first = null;

}…

}

�May 2004 � � � � � � � � �

� � � � � � � � � � � � � � � �

Linke dList

size

first

0

!May 2004 � � � � � � � � �

� � � � � � � � � � " � � # � # $ � � � � � $ � � �

Element

Node

next

element

Element Element

LinkedList

size

first

3

Node

next

elemen t

Node

next

elemen t

�May 2004 � � � � � � � � �

� � � � � � � � � � � � � � � � � � � � � �

/*** The i-th node of this LinkedList.* The LinkedList must be non-empty.* require 0 <= i && i < this.size()*/

private Node getNode (int i) {Node p = first;int pos = 0; // p is pos-th Nodewhile (pos != i) {

p = p.next;pos = pos + 1;

}return p;

}

�May 2004 � � � � � � � � �

� � � � � � � � � � � � � � � � � � � � � � � � � � �

p

Node

next

element

LinkedList

size

first

4

Node

next

element

Node

next

element

Node

next

elementÉ É É É

� �May 2004 � � � � � � � � �

� � � � � � � � � � � � � � � � � � � � � � � � � � �

p

Node

next

element

LinkedList

size

first

4

Node

next

element

Node

next

element

Node

next

elementÉ É É É

� �May 2004 � � � � � � � � �

� � � � � � � � � � � � � � � � � � � � � � � � � � �

p

Node

next

element

LinkedList

size

first

4

Node

next

element

Node

next

element

Node

next

elementÉ É É É

� �May 2004 � � � � � � � � �

� � � � � � � � � � � � � � � � � � � � � � � � � � � � �

public Element get (int index) {Node p = getNode(index);return p.element;

}

� � � � � � � � � � � � � � � � � � � � � � � � � � � � �

i+1� � � � � � � � � � � � � � �

� May 2004 ! " # $ % & ' ( ) * + ,

- . / 0 1 2 3 . 4 1 5 . 6 7 8 / 9

Given an index referencing a node to be removed::

Find previous node referencing it.:Update that node’s next;

< =May 2004 > ? @ A B C D E F G H I

J K L M N O P K Q N R K S T U L V

Node

next

element

LinkedList

size

first

4

Node

next

element

Node

next

element

Node

next

elementÉ É É É

W XY Z Y [ \ \ ] ^ Y _ Y Z ] ` Y a

b c d e f g h i j d k l m e k f i n

o pMay 2004 q r s t u v w x y z { |

} ~ � � � � � ~ � � � ~ � � � � �

p

Node

next

element

LinkedList

size

first

4

Node

next

element

Node

next

element

Node

next

elementÉ É É É

� �� � � � � � � � � � � � � � � �

� �May 2004 � � � � � � � � �

} ~ � � � � � ~ � � � ~ � � � � �

p

Node

next

element

LinkedList

size

first

4

Node

next

element

Node

next

element

Node

next

elementÉ É É É

� �� � � � � � � � � � � � � � � �

� �May 2004 � � � � � � � � �

} ~ � � � � � ~ � � � ~ � � � � �

p

Node

next

element

LinkedList

size

first

4

Node

next

element

Node

next

element

Node

next

elementÉ É É É

� �� � � � � � � � � � � � � � � �

� � � �

� �May 2004 � � � � � � � � � � !

" # $ % & ' ( # ) & * # + , - $ .

p

Node

next

element

LinkedList

size

first

4

Node

next

element

Node

next

element

Node

next

elementÉ É É É

/ 01 2 1 3 4 4 5 6 1 7 1 2 5 8 1 9

� :May 2004 � � � � � � � � � � !

" # $ % & ' ( # ) & * # + , - $ . ; < = # > , ? @ > ? < #

ARecall getNode requires argument to be greater than or equal to 0. AIf index is 0, it’s not legal to writeNode p = getNode(index-1);

ASpecial case: index 0 removes first linked list elementB

instance variable first of the LinkedList object must be modified.

� �May 2004 � � � � � � � � �

� � � � � � � � � � � � � � � � �

Node

next

element

LinkedList

size

first

4

Node

next

element

Node

next

element

Node

next

elementÉ É É É

� � � � � ! � " � # � $ � �

% &May 2004 ' ( ) * + , - . / 0 1 2

� � � � � � � � � � � � � � � � �

Node

next

element

LinkedList

size

first

4

Node

next

element

Node

next

element

Node

next

elementÉ É É É

� � � � � ! � " � # � $ � �

3 � 4 5

% %May 2004 ' ( ) * + , - . / 0 1 2

� � � � � � � � � � � � � � � � �

Node

next

element

Node

next

element

Node

next

element

LinkedList

size

first

4

Node

next

elementÉ É É É

� � � � � ! � " � # � $ � �

% 6May 2004 ' ( ) * + , - . / 0 1 2

7 � 8 9 � � � � � : � � � � � ; � � � � � � � � � � �

public void remove (int index) {if (index == 0)

first = first.next;else {

Node p = getNode(index-1);p.next = p.next.next;

}size = size - 1;

}

� �May 2004 � � � � � � � � �

� � � � � � � � � � � � � � � � � � � � � ��

To add an element at the i-th position�must find the element with index i-1�special case to consider when i is 0.

!May 2004 " # $ % & ' ( ) * + , -

. / 0 1 2 3 4 3 3 5 6 7 0 8 9 : / ; / 7 0 <

Node

next

element

Node

next

element

Node

next

element

Node

next

elementÉ É É É

= > ? ? @ A B C B D B A E @ E F A ? B G H IJ K L M E N F A ? O P B Q F R L M A R ? B INode

next

element É S T U V U W X X Y Z [ [LinkedList

size

first

4

\ ]May 2004 ^ _ ` a b c d e f g h i

j k l m n o p o o q r s l t u v k w k s l x

Node

next

element

Node

next

element

Node

next

element

Node

next

elementÉ É É É

Node

next

element É y z { | { } ~ ~ � � � �LinkedList

size

first

4 �

� �May 2004 � � � � � � � � � � � �

j k l m n o p o o q r s l t u v k w k s l x

Node

next

element

Node

next

element

Node

next

element

Node

next

elementÉ É É É

Node

next

element É y z { | { } ~ ~ � � � �LinkedList

size

first

4 �

� � � � � � � � � � � � � � � � � � � � �

� �May 2004 � � � � � � � � �

� � � � � � � � � � � � � � � � � � � � � �

Node

next

element

Node

next

element

Node

next

element

Node

next

elementÉ É É É

Node

next

element É � � ! " # # $ % & &LinkedList

size

first

4 '

( ) * + , - * - . / 0 1 * - 2 * + , -

3 4May 2004 5 6 7 8 9 : ; < = > ? @

A B C D E F G F F H I J C K L M B N B J C O

Node

next

element

Node

next

element

Node

next

element

Node

next

elementÉ É É É

Node

next

element É P Q R S R T U U V W X XLinkedList

size

first

4

Y Z [ [ Z \ ] ^ [ _ ` a

b cMay 2004 d e f g h i j k l m n o

p q r s t u v u u w x y r z { | q } q y r ~

Node

next

element

Node

next

element

Node

next

element

Node

next

elementÉ É É É

Node

next

element É � � � � � � � � � � � �LinkedList

size

first

4

� � � � � � � � � � � �

� �May 2004 � � � � � � � � � � � �

�   ¡ ¢ £ ¤ ¥ ¤ ¤ ¦ § ¨ ¡ © ª «   ¬   ¨ ¡ ­public void add (int index, Element element) {

Node newNode = new Node(element);

if (index == 0) {newNode.next = first;

first = newNode;

} else {Node p = getNode(index-1);

newNode.next = p.next;p.next = newNode;

}size = size + 1;®

}

� �May 2004 � � � � � � � � � � � �

� § ¨ �   ¤ « § � ¡ � ¥ � §¥ ¡ § £ ¨ �

�Adding a reference to last node makes adding to end of list constant.

Node

next

element

LinkedList

size

first

4

Node

next

element

Node

next

element

Node

next

elementÉ É É É

last

� �May 2004 � � � � � � � � �

� � � � � � � � � � � � � � � � � � � � � ! � " � ! � � # �

�Creates special cases in other methods. For instance, remove

public void remove (int index) {

if (size == 1) { // remove only elementfirst = null;

last = null;}else if (index == 0) {//remove first element

first = first.next;

}else {Node p = getNode(index-1);

p.next = p.next.next;if (index == size-1) //last element removed

last = p;}

size = size - 1;

}

� $May 2004 � � � � � � � � �

% & ' ( & ) * + ( & ,

-“dummy” node .

Always present at front of list,.

contains no element, .first always references header node,

.first is never null.

-Reduces special cases in the implementation of some methods.

/ 0May 2004 1 2 3 4 5 6 7 8 9 : ; <

= > ? @ > A B C @ > D

Header

next

element

LinkedList

size

first

3

Node

next

element

Node

next

element

Node

next

element

last

Element Element Element

� �

� �May 2004 � � � � � � � � �

� � � � � � � � � � � � �

�Last node references the first.

Node

next

element

LinkedList

size

first

3

Node

next

element

Node

next

elementÉ É É

� �May 2004 � � � � ! " # $ % & '

( ) * + , - . , / 0 1 2 3 , / 4 5 4

Header A B C

� 6May 2004 � � � � ! " # $ % & '

( ) * + , - . , / 0 1 2 3 , / 4 5 7 ) 0 4 5 8 * 7 5 ) 8

�Assuming Header extends Node DoublyLinkedListconstructor creates header Node, and links it to itself.

public DoublyLinkedList () {

size = 0;

header = new Header();

header.next = header;

header.previous = header;

}

� 9May 2004 � � � � ! " # $ % & '

( ) * + , - . , / 0 1 2 3 , / 4 5 7 ) 0 4 5 8 * 7 5 ) 8

Header

nextelement

DoublyLinkedList

size

header

0

previous

� �

� �May 2004 � � � � � � � � �

� � � � �� � � � � � � � � � � � � � � � � � � � ! � � � "

Header A B C

New

� #May 2004 � � � � � � � � �

� � � � �� � � � � � � � � � � � � � � � � � � � ! � � � "

Header A B C

New

$ % & ' % ( ) & * + & , - ( . / - / % ( ) & 0

1 2May 2004 3 4 5 6 7 8 9 : ; < = >

? @ A B CD E C F G H I J C F K L K M N J J O P C I Q I G L R

Header A B C

New

S % & ' % ( ) & % & T U - / V & W ) & +

1 XMay 2004 3 4 5 6 7 8 9 : ; < = >

? @ A B CD E C F G H I J C F K L K M N J J O P C I Q I G L R

Header A B C

New

S Y & W ) & + * + & , - ( . / - / % & ' % ( ) &

� �

� �May 2004 � � � � � � � � �

� � � � �� � � � � � � � � � � � � � � � � � � � ! � � � "

Header A B C

New

# $ % & ' ( % ( ) * + , % ( - % & ' (

. /May 2004 0 1 2 3 4 5 6 7 8 9 : ;

< = > ? @A B @ C D E F G @ C H I H J K F L = M F N O P

Header A B C

. QMay 2004 0 1 2 3 4 5 6 7 8 9 : ;

< = > ? @A B @ C D E F G @ C H I H J K F L = M F N O P

Header A B C

. RMay 2004 0 1 2 3 4 5 6 7 8 9 : ;

< = > ? @A B @ C D E F G @ C H I H J K F L = M F N O P

Header A B C

� �

. �May 2004 0 1 2 3 4 5 6 7 8 9 : ;

� C D E F G � C H I H @ C L C I � I C = D H

�Element access by index is linear. �Would not use a linked implementation if primary operation is to access randomly by index.�Method get uses getNode: requires i steps to get Node with index i.

� �May 2004 � � � � � � � � �

� � � � � � � �� � � � � � � � � � � � � � �� � � ! " # $ % �� � � � � &

�indexOf uses method get.�If element not found, get executes n times, with index values 0 through n-1:

value of i: 0 1 2 … n-1

steps of get(i): 0 1 2 … n-1�Steps require: 0 + 1 + 2 + … + (n-1) = (n2-n)/2.�Method is quadratic.

' (May 2004 � � � � � � � � �

) * + , - . / * - * 0 1 2 1 , 3 0 3 4 , 0 5 * 6 7 4

public int indexOf (Element element) {Node p = first;

int pos = 0;while (p != null && !element.equals(p.element)) {

p = p.next;pos = pos+1;

}

if (p == null)return -1;

elsereturn pos;

}8Method is linear.8But uses private members of the classLinkedList.