EveryDayDev
EveryDayDev

Reputation: 43

Retrieving Index from Linked List

I am wanting to iterate through my linked list and only retrieve the value at a specific index. I have written a very slow way of accomplishing this:

`

    def get_index(self, data):
        if self.head is None:
            raise Exception("List is empty")

        reg_list = []

        for i in self:
            reg_list.append(i)
        print(reg_list[data])

`

This code works but I realize this is not the fastest nor the best method for completing this operation. How can I write this better and without creating a standard list to accomplish the desired outcome?

For clarity as some are asking, here is the entirety of relevant code to make this run as I have written it and to show it is indeed a linked list:

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None


    def __repr__(self):
        return self.data

class Linked_List:
    def __init__(self, nodes=None):
        self.head = None
        if nodes is not None:
            node = Node(data=nodes.pop(0))
            self.head = node
            for elem in nodes:
                node.next = Node(data=elem)
                node = node.next

    def __repr__(self):
        node = self.head
        nodes = []
        while node is not None:
            nodes.append(node.data)
            node = node.next
        nodes.append("None")
        return " -> ".join(nodes)

    def __iter__(self):
        node = self.head
        while node is not None:
            yield node
            node = node.next


    def get_index(self, data):
        if self.head is None:
            raise Exception("List is empty")

        reg_list = []

        for i in self:
            reg_list.append(i)
        print(reg_list[data])
    ```

Upvotes: 1

Views: 503

Answers (1)

trincot
trincot

Reputation: 350300

It is confusing that your code names the argument data while it is supposed to be an index, and then names the loop variable i, which is supposed to be a node. Why not choose names that actually say what it is? Like index and node?

You can change the given code to the following:

    def get_index(self, index):
        return next((node for i, node in enumerate(self) if i == index), None)

Note that now:

  • The function returns the node. This is appropriate for such a method. Only printing the result would make the method less useful.
  • No error is raised when the list is empty. There is no reason to treat an empty list differently. The function will just return None when the given index is out of range, whether the list is empty or not.

Upvotes: 1

Related Questions