View
221
Download
0
Category
Preview:
Citation preview
�
� � � � � � � � � � � � � �� � � � � � � � � � � � � � � �
� � � � � � � � � � � � � � � � � � � � � � � � � � � � ! " # � $ $ %
& ' ( ) * + ( , -. / * 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.
Recommended