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


class Linkedlist:
    def __init__(self):
        self.head = None

    def print_list(self):
        temp = self.head
        while temp is not None:
            print(temp.data)
            temp = temp.next

    # adding nodes
    def push(self, new_data):
        new_node = Node(new_data)
        new_node.next = self.head
        self.head = new_node

    # swapping nodes
    def swapNodes(self, d1, d2):
        prevD1 = None
        prevD2 = None
        if d1 == d2:
            return
        else:
            # find d1
            D1 = self.head
            while D1 is not None and D1.data != d1:
                prevD1 = D1
                D1 = D1.next
                # find d2
            D2 = self.head
            while D2 is not None and D2.data != d2:
                prevD2 = D2
                D2 = D2.next
            if D1 is None and D2 is None:
                return
            # if D1 is head
            if prevD1 is not None:
                prevD1.next = D2
            else:
                self.head = D2
            # if D2 is head
            if prevD2 is not None:
                prevD2.next = D1
            else:
                self.head = D1
            temp = D1.next
            D1.next = D2.next
            D2.next = temp


# swapping code ends here


if __name__ == "__main__":
    list = Linkedlist()
    list.push(5)
    list.push(4)
    list.push(3)
    list.push(2)
    list.push(1)

    list.print_list()

    list.swapNodes(1, 4)
    print("After swapping")
    list.print_list()