doubly linked lists java linkedlist - mcgill cimlanger/557/5-doublylinkedlists-slides.pdf ·...

25
1 COMP 250 Lecture 5 doubly linked lists Java LinkedList Sept. 16, 2016

Upload: others

Post on 29-May-2020

25 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: doubly linked lists Java LinkedList - McGill CIMlanger/557/5-doublylinkedlists-slides.pdf · 2016-09-17 · 1 COMP 250 Lecture 5 doubly linked lists Java LinkedList Sept. 16, 2016

1

COMP 250

Lecture 5

doubly linked lists Java LinkedList

Sept. 16, 2016

Page 2: doubly linked lists Java LinkedList - McGill CIMlanger/557/5-doublylinkedlists-slides.pdf · 2016-09-17 · 1 COMP 250 Lecture 5 doubly linked lists Java LinkedList Sept. 16, 2016

Doubly linked lists

2

Each node has a reference to the next node and to the previous node.

head

tail

next prev element

Page 3: doubly linked lists Java LinkedList - McGill CIMlanger/557/5-doublylinkedlists-slides.pdf · 2016-09-17 · 1 COMP 250 Lecture 5 doubly linked lists Java LinkedList Sept. 16, 2016

class DNode< E > {

DNode< E > next;Dnode< E > prev;E element;

// constructor

DNode( E e ) { element = e;prev = null;next = null;

}

}

3

next element

prev

Page 4: doubly linked lists Java LinkedList - McGill CIMlanger/557/5-doublylinkedlists-slides.pdf · 2016-09-17 · 1 COMP 250 Lecture 5 doubly linked lists Java LinkedList Sept. 16, 2016

4

Motivation:recall removeLast ( ) for singly linked lists

head

tmp

tail

next element

The only way to access the element before the tail was to loop through all elements from the head. This took time O(N) where N is the size of the list.

Page 5: doubly linked lists Java LinkedList - McGill CIMlanger/557/5-doublylinkedlists-slides.pdf · 2016-09-17 · 1 COMP 250 Lecture 5 doubly linked lists Java LinkedList Sept. 16, 2016

5

removeLast(){

tail = tail.prev

tail.next = null

size = size – 1

:

}

For a doubly linked list, removing the last element is much faster.

head

tail

next prev element

Page 6: doubly linked lists Java LinkedList - McGill CIMlanger/557/5-doublylinkedlists-slides.pdf · 2016-09-17 · 1 COMP 250 Lecture 5 doubly linked lists Java LinkedList Sept. 16, 2016

Time Complexity (N = list size)

6

array list SLinkedList DLinkedList

addFirst O( N ) O( 1 ) O( 1 )

removeFirst O( N ) O( 1 ) O( 1 )

addLast O( 1 ) O( 1 ) O( 1 )

removeLast O( 1 ) O( N ) O( 1 )

Page 7: doubly linked lists Java LinkedList - McGill CIMlanger/557/5-doublylinkedlists-slides.pdf · 2016-09-17 · 1 COMP 250 Lecture 5 doubly linked lists Java LinkedList Sept. 16, 2016

List Operations

get(i)

set(i,e)

add(i,e)

remove(i)

:

7

For a linked list, many operations require access to node i.

The “edge cases” (i = 0, i = size – 1) usually require extra code, which can lead to coding errors.

head

tail

null

null

Page 8: doubly linked lists Java LinkedList - McGill CIMlanger/557/5-doublylinkedlists-slides.pdf · 2016-09-17 · 1 COMP 250 Lecture 5 doubly linked lists Java LinkedList Sept. 16, 2016

Common linked list trick: avoid edge cases with “dummy nodes”

8

dummyHead

dummyTail null

null

null

null

i = 0

i = 1

i = 2

i = 3

Page 9: doubly linked lists Java LinkedList - McGill CIMlanger/557/5-doublylinkedlists-slides.pdf · 2016-09-17 · 1 COMP 250 Lecture 5 doubly linked lists Java LinkedList Sept. 16, 2016

9

class DLinkedList<E>{

DNode<E> dummyHead;DNode<E> dummyTail;

int size; :

// constructor

DLinkedList<E>(){dummyHead = new DNode<E>();dummyTail = new DNode<E>();dummyHead.next = dummyTail;dummyTail.prev = dummyHead;size = 0;

}

dummyHead

dummyTail null

null

null

null

Page 10: doubly linked lists Java LinkedList - McGill CIMlanger/557/5-doublylinkedlists-slides.pdf · 2016-09-17 · 1 COMP 250 Lecture 5 doubly linked lists Java LinkedList Sept. 16, 2016

10

DLinkedList< Shape >object

dummyHead

size4

dummyTail

Q: How many objects in total in this figure?

A: 1 + 6 + 4 = 11

Page 11: doubly linked lists Java LinkedList - McGill CIMlanger/557/5-doublylinkedlists-slides.pdf · 2016-09-17 · 1 COMP 250 Lecture 5 doubly linked lists Java LinkedList Sept. 16, 2016

remove( i ) { // recall end of lecture 3 on arrays

node = getNode( i ) // next slidenode.next.prev = node.prevnode.prev.next = node.nextsize = size - 1

}

11

i – 1

i

i + 1

BEFORE AFTER

node

next prev element next prev element

Page 12: doubly linked lists Java LinkedList - McGill CIMlanger/557/5-doublylinkedlists-slides.pdf · 2016-09-17 · 1 COMP 250 Lecture 5 doubly linked lists Java LinkedList Sept. 16, 2016

getNode( i ) {

// check that 0 <= i < size (omitted)

node = dummyHead.nextfor (k = 0; k < i; k ++)

node = node.nextreturn node

}

[SLIDE WAS ADDED AFTER LECTURE]

12

Page 13: doubly linked lists Java LinkedList - McGill CIMlanger/557/5-doublylinkedlists-slides.pdf · 2016-09-17 · 1 COMP 250 Lecture 5 doubly linked lists Java LinkedList Sept. 16, 2016

getNode( i ) {

if ( i < size/2 ){ // iterate from headnode = dummyHead.nextfor (k = 0; k < i; k ++)

node = node.next;}

else{ // iterate from tailnode = dummyTail.prevfor ( k = size-1; k > i; k -- )

node = node.prev}

return node}

More efficient (half the time)…

13

Page 14: doubly linked lists Java LinkedList - McGill CIMlanger/557/5-doublylinkedlists-slides.pdf · 2016-09-17 · 1 COMP 250 Lecture 5 doubly linked lists Java LinkedList Sept. 16, 2016

Time Complexity (N = list size)

14

array list SLinkedList DLinkedList

addFirst O( N ) O( 1 ) O( 1 )

removeFirst O( N ) O( 1 ) O( 1 )

addLast O( 1 ) O( 1 ) O( 1 )

removeLast O( 1 ) O( N ) O( 1 )

remove( i ) ? ? ?

Page 15: doubly linked lists Java LinkedList - McGill CIMlanger/557/5-doublylinkedlists-slides.pdf · 2016-09-17 · 1 COMP 250 Lecture 5 doubly linked lists Java LinkedList Sept. 16, 2016

Time Complexity (N = list size)

15

array list SLinkedList DLinkedList

addFirst O( N ) O( 1 ) O( 1 )

removeFirst O( N ) O( 1 ) O( 1 )

addLast O( 1 ) O( 1 ) O( 1 )

removeLast O( 1 ) O( N ) O( 1 )

remove( i ) O(N) O( N ) O( N )

As I will discuss that later, “O( )” ignores constant factors.

Page 16: doubly linked lists Java LinkedList - McGill CIMlanger/557/5-doublylinkedlists-slides.pdf · 2016-09-17 · 1 COMP 250 Lecture 5 doubly linked lists Java LinkedList Sept. 16, 2016

Java LinkedList class

https://docs.oracle.com/javase/8/docs/api/java/util/LinkedList.html

It uses a doubly linked list as the underlying data structure.

It has some methods that ArrayList doesn’t have e.g.:

• addFirst()

• removeFirst()

• addLast()

• removeLast()

16

Page 17: doubly linked lists Java LinkedList - McGill CIMlanger/557/5-doublylinkedlists-slides.pdf · 2016-09-17 · 1 COMP 250 Lecture 5 doubly linked lists Java LinkedList Sept. 16, 2016

17

Q: What is the time complexity of the following ?

LinkedList< E > list = new LinkedList< E >( ) ;

for (k = 0; k < N; k ++) // N is some constantlist.addFirst( new E( …. ) ); // or addLast(..)

for (k = 0; k < k < list.size(); k ++)list.get( k );

Page 18: doubly linked lists Java LinkedList - McGill CIMlanger/557/5-doublylinkedlists-slides.pdf · 2016-09-17 · 1 COMP 250 Lecture 5 doubly linked lists Java LinkedList Sept. 16, 2016

18

Q: What is the time complexity of the following ?

LinkedList< E > list = new LinkedList< E >( ) ;

for (k = 0; k < N; k ++) // N is some constantlist.addFirst( new E( …. ) ); // or addLast(..)

A: 𝟏 + 𝟏 + 𝟏 + … . 𝟏 = 𝑵 𝑶( 𝑵 )

for (k = 0; k < k < list.size(); k ++)list.get( k );

I am omitting what I would do with this element since that’s not the point here e.g. I could print it.

Page 19: doubly linked lists Java LinkedList - McGill CIMlanger/557/5-doublylinkedlists-slides.pdf · 2016-09-17 · 1 COMP 250 Lecture 5 doubly linked lists Java LinkedList Sept. 16, 2016

19

Q: What is the time complexity of the following ?

LinkedList< E > list = new LinkedList< E >( ) ;

for (k = 0; k < N; k ++) // N is some constantlist.addFirst( new E( …. ) ); // or addLast(..)

A: 𝟏 + 𝟏 + 𝟏 + … . 𝟏 = 𝑵 𝑶( 𝑵 )

for (k = 0; k < k < list.size(); k ++) // size == Nlist.get( k );

A: 𝟏 + 𝟐 + 𝟑 + … . 𝐍 =𝑵 𝑵+𝟏

𝟐𝑶( 𝑵𝟐)

Here I am assuming the first getNode(i) is used, which always starts at the head.See the Exercises for the expression when the more efficient getNode(i) method is used.

Page 20: doubly linked lists Java LinkedList - McGill CIMlanger/557/5-doublylinkedlists-slides.pdf · 2016-09-17 · 1 COMP 250 Lecture 5 doubly linked lists Java LinkedList Sept. 16, 2016

ASIDE: Java ‘enhanced for loop’

for (k = 0; k < list.size(); k ++)

…….

A more efficient way to iterate through elements in a LinkedList object is to use:

for (E e : list)

// ‘list’ references the LinkedList< E > object

// Do something with each element e in list 20

Page 21: doubly linked lists Java LinkedList - McGill CIMlanger/557/5-doublylinkedlists-slides.pdf · 2016-09-17 · 1 COMP 250 Lecture 5 doubly linked lists Java LinkedList Sept. 16, 2016

What about “Space Complexity” ?

21

null

null

All three data structures use space O(N) for a list of N elements.

Page 22: doubly linked lists Java LinkedList - McGill CIMlanger/557/5-doublylinkedlists-slides.pdf · 2016-09-17 · 1 COMP 250 Lecture 5 doubly linked lists Java LinkedList Sept. 16, 2016

Java terminology (time permitting)

• method “signature”• name• number and type of parameters, • return type

• method “overloading” • add( int index, E element)• add( E element )

• remove(E element) • remove(int i)

22

Page 23: doubly linked lists Java LinkedList - McGill CIMlanger/557/5-doublylinkedlists-slides.pdf · 2016-09-17 · 1 COMP 250 Lecture 5 doubly linked lists Java LinkedList Sept. 16, 2016

Java terminology

What is method “overloading” vs. “overriding” ?

Classes can “inherit” methods from other classes.

Sometimes you do not want a class to inherit the method, however, and so you “override” it by writing a more suitable one.

We will learn about inheritance formally at the end of the course…..

23

Page 24: doubly linked lists Java LinkedList - McGill CIMlanger/557/5-doublylinkedlists-slides.pdf · 2016-09-17 · 1 COMP 250 Lecture 5 doubly linked lists Java LinkedList Sept. 16, 2016

Announcements

• Assignment 1 posted (due in ~2 weeks)

• Exercises for singly linked lists (practice coding)

• Eclipse (IDE) tutorials next week.

Goodbye DrJava ! Hello Eclipse !

24

Page 25: doubly linked lists Java LinkedList - McGill CIMlanger/557/5-doublylinkedlists-slides.pdf · 2016-09-17 · 1 COMP 250 Lecture 5 doubly linked lists Java LinkedList Sept. 16, 2016

I asked the TA’s which IDE they use:

• Eclipse or sublime

• jetbrains, IntelliJ

• Eclipse

• Eclipse, also IntelliJ

• Eclipse

• Simple text editor / vim + command line. (However I had to use Eclipse and DrJava in the past.)

• Eclipse, but I like using text editor + command line for small things.

• Eclipse (netbeans for GUIs)

25