20
COMPSCI 105 S2 2014 Principles of Computer Science Linked Lists 2

COMPSCI 105 S2 2014 Principles of Computer Science Linked Lists 2

Embed Size (px)

Citation preview

COMPSCI 105 S2 2014Principles of Computer Science

Linked Lists 2

Agenda & Reading Agenda

Introduction The OrderedList Operations Iterators Linked List Iterators

Extra Reading Textbook:

Problem Solving with Algorithms and Data Structures Chapter 3 – The Ordered List Abstract Data Type

Reference: http://www.bogotobogo.com/python/python_iterators.php

10COMPSCI1052

3

18.1 Introduction

Unordered Vs Ordered A list is a collection of items where each item

holds a relative position with respect to the others. It must maintain a reference to the first node (head) It is commonly known as a linked list

Unordered Vs Ordered Unordered meaning that the items are not stored in a

sorted fashion.

10COMPSCI105

54, 26, 93, 17, 77 and 31 17, 26, 31, 54, 77 and 93

Unordered Ordered

4

18.2 The OrderedList

The OrderedList The structure of an ordered list is a collection of

items where each item holds a relative position that is based upon some underlying characteristic of the item. i.e. either ascending or descending

10COMPSCI105

my_orderedlist = OrderedList()num_list = [77, 17, 26, 31, 93, 54]for num in num_list: my_orderedlist.add(num)

Integers are in ascending order

5

18.2 The OrderedList

The OrderedList ADT Constructor is_empty() size() remove()

add() search()

10COMPSCI105

Same as those of UnorderedList

Different!

6

18.2 The OrderedList

The OrderedList Abstract Data Type What are the operations which can be used with an

OrderedList Abstract Data? creates a new list that is empty.

It needs no parameters and returns an empty list. add(item) adds a new item to the list.

It needs the item and returns nothing. Assume the item is not already in the list.

remove(item) removes the item from the list. It needs the item and modifies the list. Assume the item is present in

the list. search(item) searches for the item in the list.

It needs the item and returns a boolean value. is_empty() tests to see whether the list is empty.

It needs no parameters and returns a boolean value. size() returns the number of items in the list.

It needs no parameters and returns an integer.

No checking is done in the implementati

on!

17COMPSCI105

18.3 Operations

Inserting a Node (Review) UnorderedList

Only insert new item at the beginning of a linked list

Create a new Node and store the new data into it Connect the new node to the linked list by

changing references change the next reference of the new node to refer to

the old first node of the list modify the head of the list to refer to the new node

10COMPSCI1057

12

new_node.set_next(self.head)self.head = new_node

new_node = Node(item)

18.3 Operations

Inserting a Node - OrderedList OrderedList

Create a new node and store the new data in it

Determine the point of insertion Insert at the beginning of a linked list, OR Insert at the middle of a linked list

Use the prev reference

Connect the new node to the linked list by changing references

10COMPSCI1058

new_node = Node(item)Must determine

the point of insertion

9

18.3 Operations

Determine the point of insertion Starting point:

current = self.head previous = None stop = False

10COMPSCI105

while current != None and not stop: if current.get_data() > item: stop = True else: previous = current current = current.get_next()

Integers are in ascending order

my_orderedlist.add(49)

previous previousprevious

26 < 49

31 < 49

54 > 4917 <

49

18.3 Operations

Inserting a Node - OrderedList Insert at the beginning of a linked list

Insert at the middle of a linked list change the next reference of the new node to refer to the

current node of the list modify the next reference of the prev node to refer to the

new node

12

12

10COMPSCI10510

new_node.set_next(self.head)self.head = new_node

new_node.set_next(current) previous.set_next(new_node)

18.3 Operations

Searching an Item Searches for the item in the list. Returns a

Boolean. Examples:

10COMPSCI10511

print (my_linked_list.search(31))

print (my_linked_list.search(39))

current

current

True

False

18.3 Operations

Searching an item To search an item in a linked list:

set a pointer to be the same address as head, process the data in the node, (search) move the pointer to the next node, and so on. Loop stops either 1) found the item, or 2) when the

next pointer is None, or 3) value in the node is greater than the item that we are searching

10COMPSCI10512

current = self.headwhile current != None: if current.get_data() == item: return True elif current.get_data() > item: return False else: current = current.get_next()

return False

18.3 Operations

UnorderedList Vs OrderedList

UnorderedList OrderedList

is_empty O(1) O(1)

size O(1) with count variable O(1) with count variable

add O(1) O(n)

remove O(n) O(n)

search O(n) O(n)

10COMPSCI10513

14

18.4 Iterators

Iterators Traversals are very common operations, especially on

containers. Python’s for loop allows programmer to traverse items in

strings, lists, tuples, and dictionaries:

Python compiler translates for loop to code that uses a special type of object called an iterator

An iterator guarantees that each element is visited exactly once. It is useful to be able to traverse an UnorderedList or an

OrderedList, i.e., visit each element exactly once.10COMPSCI105

15

18.4 Iterators

An Example: Python List Traversals All of Python's standard built-in sequence types

support iteration The for-in statement makes it easy to loop over the

items in a list:

The list object supports the iterator protocol. To explicitly create an iterator, use the built-in iter

function:

10COMPSCI105

for item in num_list: print(item)

i = iter(num_list)print(next(i)) # fetch first valueprint(next(i))

12

123

16

18.4 Iterators

Create your own Iterator You can create your own iterators if you write a

function to generate the next item. You need to add: Constructor The __iter__() method, which must return the iterator

object, and the __next__() method, which returns the next

element from a sequence. For example:

10COMPSCI105

my_iterator = NumberIterator(11, 20) for num in my_iterator: print(num, end=" ") 11 12 13 14 15 16 17 18

19 20

17

18.4 Iterators

The NumberIterator Class Constructor, __iter__(), __next__

10COMPSCI105

class NumberIterator:

def __init__(self, low, high): self.current = low self.high = high

def __iter__(self): return self

def __next__(self): if self.current > self.high: raise StopIteration else: self.current += 1 return self.current - 1

Raise this error to tellconsumer to stop

18

18.5 Linked List Iterators

Linked List Traversals Now, we would like to traverse an UnorderedList

or an OrderedList using a for-loop, i.e., visit each element exactly once.

However, we will get the following error:

Solution: Create an iterator class for the linked list. Add the __iter()__ method to return an instance of the

LinkedListIterator class.10COMPSCI105

for num in my_linked_list: print(num, end=" ")

for num in my_linked_list:TypeError: 'UnorderedList' object is not iterable

19

18.5 Linked List Iterators

The LinkedListIterator The UnorderedList class:

10COMPSCI105

class LinkedListIterator: def __init__( self, head): self.current = head

def __next__( self ): if self.current != None: item = self.current.get_data() self.current = self.current.get_next() return item else : raise StopIteration

class UnorderedList:... def __iter__(self): return LinkedListIterator(self.head)

20

Exercise What is the content inside the UnorderedList and

OrderedList after executing the following code fragment?

10COMPSCI105

name_list = ["Gill", "Tom", "Eduardo", "Raffaele", "Serena", "Bella"]

my_unorderedlist = UnorderedList()for name in name_list: my_unorderedlist.add(name)

my_orderedlist = OrderedList()for name in name_list: my_orderedlist.add(name)