## Extra Mutable Linked List Questions ## # Q6 def reverse(link): """Returns a Link that is the reverse of the original. >>> print_link(reverse(Link(1))) <1> >>> link = Link(1, Link(2, Link(3))) >>> new = reverse(link) >>> print_link(new) <3 2 1> >>> print_link(link) <1 2 3> """ "*** YOUR CODE HERE ***" # Q7 def add_links(link1, link2): """Adds two Links, returning a new Link >>> l1 = Link(1, Link(2)) >>> l2 = Link(3, Link(4, Link(5))) >>> new = add_links(l1,l2) >>> print_link(new) <1 2 3 4 5> """ "*** YOUR CODE HERE ***" # Q8 def slice_link(link, start, end): """Slices a Link from start to end (as with a normal Python list). >>> link = Link(3, Link(1, Link(4, Link(1, Link(5, Link(9)))))) >>> new = slice_link(link, 1, 4) >>> print_link(new) <1 4 1> """ "*** YOUR CODE HERE ***" # Linked List Class class Link: empty = () def __init__(self, first, rest=empty): assert rest is Link.empty or isinstance(rest, Link) self.first = first self.rest = rest def print_link(link): """Print elements of a linked list link. >>> link = Link(1, Link(2, Link(3))) >>> print_link(link) <1 2 3> >>> link1 = Link(1, Link(Link(2), Link(3))) >>> print_link(link1) <1 <2> 3> >>> link1 = Link(3, Link(Link(4), Link(5, Link(6)))) >>> print_link(link1) <3 <4> 5 6> """ print('<' +helper(link).rstrip() +'>') def helper(link): if link == Link.empty: return '' elif isinstance(link.first, Link): return '<' +helper(link.first).rstrip() + '> '+ helper(link.rest) else: return str(link.first) +' '+ helper(link.rest)