Linked lists memory view -...

Post on 19-Oct-2020

3 views 0 download

Transcript of Linked lists memory view -...

Linked lists memory view

lst = Linked_list("abc")

name space

memory space

lst

next

value

next

“a”

value

next

“b”

value

next

“c”

None

type: Node type: Node type: Node type:

linked_list

next

next

lst.reverse()

value

next

“a”

value

next

“b”

value

next

“c”

None

value

next

“a”

value

next

“b”

value

next

“c”

None

Exercise: implement list reverse with O(1) additional memory

Guidance

value

next

value

next

value

next

1. Think about “the middle” of the process.

You have 2 consecutive elements prev, curr.

All elements up to prev were reversed.

Write the loop’s body.

2. Think about the initialization of prev, curr

3. Think about termination of the loop and

extra actions after it

value

next

prev curr

next

Solution

value

next

“a”

value

next

“b”

value

next

“c”

None

def reverse(self):

prev = None

curr = self.next

while curr !=None:

tmp = curr.next

curr.next = prev

prev = curr

curr = tmp

self.next = prev

>>> lst = Linked_list("abcde")

>>> lst

[a,36067440] [b,36067376] [c,36067024] [d,36067312] [e,36066864]

>>> lst.reverse()

>>> lst

[e,36066864] [d,36067312] [c,36067024] [b,36067376] [a,36067440]

Demo

next

value

next

“a”

value

next

“b”

value

next

“c”

None

prev curr

Initialization

def reverse(self):

prev = None

curr = self.next

while curr !=None:

tmp = curr.next

curr.next = prev

prev = curr

curr = tmp

self.next = prev

None

Demo

next

value

next

“a”

value

next

“b”

value

next

“c”

None

prev curr

Step 1

def reverse(self):

prev = None

curr = self.next

while curr !=None:

tmp = curr.next

curr.next = prev

prev = curr

curr = tmp

self.next = prev

None

tmp

Demo

next

value

next

“a”

value

next

“b”

value

next

“c”

None

prev curr

Step 1

def reverse(self):

prev = None

curr = self.next

while curr !=None:

tmp = curr.next

curr.next = prev

prev = curr

curr = tmp

self.next = prev

None

tmp

Demo

next

value

next

“a”

value

next

“b”

value

next

“c”

None

prev curr

Step 1

def reverse(self):

prev = None

curr = self.next

while curr !=None:

tmp = curr.next

curr.next = prev

prev = curr

curr = tmp

self.next = prev

None

tmp

Demo

next

value

next

“a”

value

next

“b”

value

next

“c”

None

prev curr

Step 1

def reverse(self):

prev = None

curr = self.next

while curr !=None:

tmp = curr.next

curr.next = prev

prev = curr

curr = tmp

self.next = prev

None

tmp

Demo

next

value

next

“a”

value

next

“b”

value

next

“c”

None

prev curr

Step 2

def reverse(self):

prev = None

curr = self.next

while curr !=None:

tmp = curr.next

curr.next = prev

prev = curr

curr = tmp

self.next = prev

None

tmp

Demo

next

value

next

“a”

value

next

“b”

value

next

“c”

None

prev curr

Step 3

def reverse(self):

prev = None

curr = self.next

while curr !=None:

tmp = curr.next

curr.next = prev

prev = curr

curr = tmp

self.next = prev

None

tmp

Demo

next

value

next

“a”

value

next

“b”

value

next

“c”

None

prev curr

Termination

def reverse(self):

prev = None

curr = self.next

while curr !=None:

tmp = curr.next

curr.next = prev

prev = curr

curr = tmp

self.next = prev

None

tmp