Как можно вывести связанный список используя __str__ без дополнительных классов?

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


class List:
    head = None
    tail = None

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

    def append(self, data):
        node = Node(data, None)
        if self.head is None:
            self.head = self.tail = node
        else:
            self.tail.next = node
        self.tail = node


p = List()
p.append(15)
p.append(25)
p.print_list()

Ответы (2 шт):

Автор решения: MaxU

Попробуйте так:

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

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

class List:
    head = None
    tail = None

    def __str__(self):
        a = self.head
        res = ""
        while a is not None:
            res += (" -> " if res else "") + str(a)
            a = a.next
        return res

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

    def append(self, data):
        node = Node(data, None)
        if self.head is None:
            self.head = self.tail = node
        else:
            self.tail.next = node
        self.tail = node

p = List()
p.append(15)
p.append(25)
#p.print_list()
print(p)

выведет

15 -> 25
→ Ссылка
Автор решения: CrazyElf

Независимо от MaxU уважаемого я набросал тоже класс, но добавил возможность итерироваться по классу и использовал это при печати оного (подсмотрев только стрелку в качестве разделителя у MaxU):

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

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

class List:
    head = None
    tail = None

    def append(self, data):
        node = Node(data, None)
        if self.head is None:
            self.head = self.tail = node
        else:
            self.tail.next = node
        self.tail = node

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

    def __str__(self):
        return ' -> '.join(map(str,self))

p = List()
p.append(5)
p.append(15)
p.append(25)
print(p)

Вывод:

5 -> 15 -> 25
→ Ссылка