1. 程式人生 > >Python用遞迴實現連結串列

Python用遞迴實現連結串列

題目要求: You must complete and implement the following functions in Recursion.py. Take note of the specified return values and input parameters. Do not change the function signatures.

In addition to the Mimir testing, you will also be graded on the run time performance of your functions. See below what is expected for each function.

insert(value, node=None) Insert the given value into the linked list that has head node The value should be inserted such that the list remains in ascending order Return the starting node of the linked list Worst case: O(n) string(node) Generate and return a string representation of the list, starting at node The values should be separated by a comma and a single space, with no leading or trailing comma Worst case: O(n) reversed_string(node) Generate and return a string representation of the list with head node, in reverse order The values should be separated by a comma and a single space, with no leading or trailing comma Worst case: O(n) remove(value, node) Remove the first node in the list with the given value starting at head node Return the starting node of the linked list Worst case: O(n) remove_all(value, node) Remove all nodes in the list with the given value starting at head node Return the starting node of the linked list Worst case: O(n) search(value, node) Looks for value in list starting with head node Returns True if the value is in the list and False if it is not in the list Worst case: O(n) length(node) Calculates and returns the length of the list starting with head node Worst case: O(n) sum_all(node) Calculates and returns the sum of the list starting with head node Worst case: O(n) count(value, node) Counts how many times the given value occurs in the list starting at head node Worst case: O(n)

class LinkedNode:
    # DO NOT MODIFY THIS CLASS #
    __slots__ = 'value', 'next_node'

    def __init__(self, value, next_node):
        """
        DO NOT EDIT
        Initialize a node
        :param value: value of the node
        :param next_node: pointer to the next node
        """
        self.
value = value # element at the node self.next_node = next_node # reference to next node def __str__(self): """ DO NOT EDIT String representation of a node :return: string of value """ return str(self.value) __repr__ = __str__
from LinkedNode import LinkedNode


def insert(value, node=None):
    """
    Insert the given value into the linked list that has head node
    :param value: value to insert
    :param node: head node for the the remaining list
    :return: head node
    """
    if node:
        if node.value >= value:
            node = LinkedNode(value, node)
        elif node.next_node:
            if node.next_node.value >= value:
                tmp = LinkedNode(value, node.next_node)
                node.next_node = tmp
            else:
                # Recursively find the nodes that meet the criteria
                insert(value, node.next_node)
        else:
            tmp = LinkedNode(value, None)
            node.next_node = tmp
    else:
        node = LinkedNode(value, None)
        return node
    return node


def string(node):
    """
    Generate and return a string representation of the list, starting at node
    :param node: head node for the the remaining list
    :return: string of all nodes
    """
    if node:
        if node.next_node:
            tmp_words = string(node.next_node)
            # Composite string
            return str(node.value) + ', ' + tmp_words
        else:
            return str(node.value)
    else:
        return ''


def reversed_string(node):
    """
    Generate and return a string representation of the list with head node, in reverse order
    :param node: head node for the the remaining list
    :return: string of all nodes in reverse order
    """
    if node:
        if node.next_node:
            tmp_words = reversed_string(node.next_node)
            # Composite string
            return tmp_words + ', ' + str(node.value)
        else:
            return str(node.value)
    else:
        return ''


def remove(value, node):
    """
    Remove the first node in the list with the given value starting at head node
    :param value:
    :param node: head node for the the remaining list
    :return: head node
    """
    if node:
        if node.value == value:
            if node.next_node:
                node.value = node.next_node.value
                node.next_node = node.next_node.next_node
            else:
                return None
        elif node.next_node:
            if node.next_node.value == value:
                node.next_node = node.next_node.next_node
            else:
                # Recursively find the value to delete
                remove(value, node.next_node)
        return node
    else:
        return None


def remove_all(value, node):
    """
    Remove all nodes in the list with the given value starting at head node
    :param value:
    :param node: head node for the the remaining list
    :return: head node
    """
    if node:
        if node.value == value:
            if node.next_node:
                node.value = node.next_node.value
                node.next_node = node.next_node.next_node
                remove_all(value, node)
                if node.next_node:
                    remove_all(value, node.next_node)
            else:
                return None
        elif node.next_node:
            if node.next_node.value == value:
                if node.next_node.next_node:
                    node.next_node = node.next_node.next_node
                else:
                    node.next_node = None
                # Recursively the remained nodes to find the value to delete
                remove_all(value, node)
            # Recursively the remained nodes to find the value to delete
            remove_all(value, node.next_node)
        return node
    return None


def search(value, node):
    """
    Looks for value in list starting with head node
    :param value:
    :param node: head node for the the remaining list
    :return: Return True if have the value in LinkList or return False
    """
    if node:
        if node.value == value:
            return True
        else:
            # Recursively look for the remaining nodes and find the matching nodes
            return search(value, node.next_node)
    else:
        return False


def length(node):
    """
    Calculates and returns the length of the list starting with head node
    :param node: head node for the the remaining list
    :return: The length of the LinkList
    """
    if node:
        # The length is computed recursively and each new node is incremented by 1
        return length(node.next_node) + 1
    else:
        return 0


def sum_all(node):
    """
    Calculates and returns the sum of the list starting with head node
    :param node: head node for the the remaining list
    :return: The sum value
    """
    if node:
        # The value is computed recursively and each new node is incremented by its value
        return sum_all(node.next_node) + node.value
    else:
        return 0


def count(value, node):
    """
    Counts how many times the given value occurs in the list starting at head node
    :param value:
    :param node: head node for the the remaining list
    :return: the number of nodes who's value is the value searched
    """
    if node:
        if node.value == value:
            # add 1 if the node is needed
            return count(value, node.next_node) + 1
        else:
            # Recurse to the next node
            return count(value, node.next_node)
    else:
        return 0