Commit a315b431 authored by Ing. Petr Pauš, Ph.D.'s avatar Ing. Petr Pauš, Ph.D.
Browse files

cviceni 03

parent 863bc327
Loading
Loading
Loading
Loading
+71 −0
Original line number Diff line number Diff line
class Node:
    def __init__(self, data:any):
        self.data = data
        self.next = None

    def __str__(self):
        return str(self.data)


class LinkedList:
    def __init__(self) -> None:
        self.head = None

    def add_at_begin(self, data):
        new_node = Node(data)
        new_node.next = self.head
        self.head = new_node

    def __str__(self) -> str:
        current_node = self.head
        result = ''
        while current_node != None:
            result += str(current_node.data) + ' -> '
            current_node = current_node.next
        return result + 'None'
    
    def remove_at_begin(self) -> any:
        if self.head == None:
            return None
        data = self.head.data
        self.head = self.head.next
        return data

    def find(self, index:int) -> Node:
        if self.head == None:
            return None
        
        if index == 0:
            return None

        pos = 0
        current_node = self.head
        while current_node and pos + 1 < index:
            pos += 1
            current_node = current_node.next
        
        return current_node
    
    def remove_at_index(self, index:int) -> any:
        current_node = self.find(index)
        if index==0:
            return self.remove_at_begin()
        if current_node==None or current_node.next == None:
            return None
        data = current_node.next.data
        current_node.next = current_node.next.next
        return data



ll = LinkedList()
ll.add_at_begin(1)
ll.add_at_begin("Ahoj")
ll.add_at_begin(3)
print(ll)

print(ll.find(0))
print(ll.find(1))
print(ll.find(2))
print(ll.remove_at_index(0))
print(ll)
 No newline at end of file
+104 −0
Original line number Diff line number Diff line
class Node:
    def __init__(self, data) -> None:
        self.data = data
        self.next = None

    def __str__(self) -> str:
        return str(self.data)
    
class LinkedList:
    def __init__(self) -> None:
        self.head = None

    def add_at_begin(self, data) -> None:
        new_node = Node(data)
        new_node.next = self.head
        self.head = new_node

    # def __str__(self) -> str:
    #     current_node = self.head
    #     result = '[ '

    #     while current_node!=None:
    #         result = result + str(current_node) + ' -> '
    #         current_node = current_node.next

    #     return result + 'None ]'
        
    def __str__(self) -> str:
        result = '[ '

        for x in self:
            result += str(x) + ' -> '

        return result + 'None ]'
    
    def remove_at_begin(self) -> any:
        if not self.head:   #if self.head == None
            return None
        
        data = self.head.data
        self.head = self.head.next
        return data
    
    def find(self, index:int) -> tuple[Node, Node]:
        if index<0:
            return None, None
        if not self.head:
            return None, None
        pos = 0
        current_node = self.head
        prev_node = None

        while current_node and pos<index:
            pos += 1
            prev_node = current_node
            current_node = current_node.next

        return prev_node, current_node
    
    def remove_at_index(self, index:int) -> any:
        prev, current = self.find(index)
        if current==None:
            return None
        if prev==None:
            return self.remove_at_begin()
        data = current.data
        prev.next = current.next
        return data
        
    def insert_at_index(self, data, index) -> None:
        prev, current = self.find(index)
        if prev and not current:
            new_node = Node(data)
            prev.next = new_node
            return None
        if current==None:
            return None
        if prev==None:
            self.add_at_begin(data)
            return None
        new_node = Node(data)
        new_node.next = current
        prev.next = new_node

    def __iter__(self):
        current_node = self.head
        while current_node:
            yield current_node
            current_node = current_node.next


ll = LinkedList()

ll.add_at_begin(10)
ll.add_at_begin("Ahoj")
ll.add_at_begin(1.5)
print(ll)
ll.insert_at_index("ABC", 3)
print(ll)

for x in ll:
    print(x)