Mike
Mike

Reputation: 201

Add Node function not working singly linked list python

I'm a Noob, struggling to understand and implement a singly linked list, that adds items at the tail. I believe the only code that is not working is the add function, which I can't figure out the logic for. I believe I want to set the first node to be the head, and then insert each other element at the tail, changing the pointer for head to point to the 2nd item when adding it, then the pointer for the 2nd item to point to the third etc., but can't figure out how to go about coding that (to deal with an unknown number of strings, here 3 for simplicity.

strings = ["one", "two", "three"]


class Node:
    def __init__(self,data,nextNode=None):
        # populate the Node, with data and pointer
        self.data = data
        self.nextNode = nextNode

    def getData(self):
        # method to get value of this node
        return self.data

    def setData(self,val):
        # set value of node to val
        self.data = val

    def getNextNode(self):
        # get the pointer to the next node
        return self.nextNode

    def setNextNode(self,val):
        # set pointer to the next node
        self.nextNode = val

class LinkedList:

    def __init__(self, head = None, tail = None):
        # initial properties of linked list, size 0
        self.head = head
        self.tail = tail
        self.size = 0

    def getSize(self):
        # get size of linked list
        return self.size

    def addNode(self,data):
        # Head should point to first node, which will have a value, and a Null pointer
        if (self.size == 0):
            newNode = Node(data, self.tail)
            self.head.getNextNode() = newNode
        else:
        # All additional nodes should be inserted at tail, and with the pointers for the prior nodes changed to point to the new node
            newNode = Node(data, self.tail)
            self.tail = newNode
            self.size += 1
            return True

    def printNode(self):
        curr = self.head
        while curr:
            print(curr.data)#, curr.nextNode)
            curr = curr.getNextNode()

mylist = LinkedList()

for i in strings:
    mylist.addNode(i)

mylist.printNode()

# desired output: Head -> one --> two --> three/Tail

Upvotes: 0

Views: 835

Answers (1)

Shihab Shahriar Khan
Shihab Shahriar Khan

Reputation: 5455

There were many little mistakes, please find them in code below. And let me know if you don't understand something.

One important change is a new node shouldn't have access to its next node. Its already the last node, so there can't be any node next to it. Also please pay close attention to else block of addNode function.

strings = ["one", "two", "three","four","five"]

class Node:
    def __init__(self,data):
        # populate the Node, with data and pointer
        self.data = data
        self.nextNode = None

    def getData(self):
        # method to get value of this node
        return self.data

    def setData(self,val):
        # set value of node to val
        self.data = val

    def getNextNode(self):
        # get the pointer to the next node
        return self.nextNode

    def setNextNode(self,val):
        # set pointer to the next node
        self.nextNode = val

class LinkedList:

    def __init__(self, head = None, tail = None):
        # initial properties of linked list, size 0
        self.head = head
        self.tail = tail
        self.size = 0

    def getSize(self):
        # get size of linked list
        return self.size

    def addNode(self,data):
        # Head should point to first node, which will have a value, and a Null pointer
        if (self.size == 0):
            self.head = Node(data)
            self.tail = self.head
            self.size = 1
        else:
        # All additional nodes should be inserted at tail, and with the pointers for the prior nodes changed to point to the new node
            newNode = Node(data)
            self.tail.nextNode = newNode
            self.tail = newNode
            self.size += 1
            return True

    def printNode(self):
        curr = self.head
        while curr:
            print(curr.data)#, curr.nextNode)
            curr = curr.getNextNode()

mylist = LinkedList()

for i in strings:
    mylist.addNode(i)

mylist.printNode()

Upvotes: 1

Related Questions