Python 对节点中包含两个数据的链表进行排序

Python 对节点中包含两个数据的链表进行排序,python,data-structures,linked-list,Python,Data Structures,Linked List,相反,现在我想知道艺术家的名字是否可以按降序排列。请随意添加其他有助于我理解的方法。(例如deleteNode、insertNode等) 电流输出: class Node : def __init__(self, newData=None, newArtist=None, nextNode=None): self.data = newData self.artist = newArtist self.next = nextNode

相反,现在我想知道艺术家的名字是否可以按降序排列。请随意添加其他有助于我理解的方法。(例如deleteNode、insertNode等)

电流输出:

class Node :
    def __init__(self, newData=None, newArtist=None, nextNode=None):
        self.data = newData
        self.artist = newArtist
        self.next  = nextNode

    def getData(self):
        return self.data

    def setData(self, newData):
        self.data = newData

    def getArtist(self):
        return self.artist

    def setArtist(self, newArtist):
        self.artist = newArtist

    def getNext(self):
        return self.next

    def setNext(self, newNode):
        self.next = newNode

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

    def next(self, newNode, newData=None, newArtist=None):
        self.head = newNode
        self.data = newData
        self.artist = newArtist

    def printAll(self):
        i = 1
        if self.head:
            node = self.head
            if node.data:
                print('1: {} - {}'.format(node.getData(), node.getArtist()))
                i += 1
            while node.getNext():
                node = node.getNext()
                if node.data:
                    print('{}: {} - {}'.format(i, node.getData(), node.getArtist()))
                    i += 1

Song1 = Node("Silent Night", "John")
Song2 = Node("Last Christmas", "Andy")
Song3 = Node("Jingle Bells", "Mary")
Song4 = Node("Joy to the World", "Brad")

music_collection = LinkedList()
music_collection.next(Song1)
Song1.setNext(Song2)
Song2.setNext(Song3)
Song3.setNext(Song4)
music_collection.printAll()
按艺术家姓名降序排序的输出:

1: Silent Night - John
2: Last Christmas - Andy
3: Jingle Bells - Mary
4: Joy to the World - Brad

总的来说,我认为您的实现相当复杂。例如,我不明白为什么需要使用任何参数调用
LinkedList
\uuuu init\uuu
方法。另外,我建议您重命名
next
函数,因为它可能会与迭代器协议的同名函数混淆。你可能想研究更优雅的解决方案

也就是说,请将这段代码用作
printAll
函数:

1: Jingle Bells - Mary
2: Silent Night - John
3: Joy to the World - Brad
4: Last Christmas - Andy
解决方案1:您的解决方案 我已将
delete
方法添加到
节点
类中,并将索引添加到
printAll
方法中:

def printAll(self):
    pointer = self.head
    idx = 1

    while pointer is not None:
        print(f'{idx}: {pointer.data} - {pointer.artist}')
        pointer = pointer.next
        idx += 1
我得到了以下关于输出的信息:

class Node:
    def __init__(self, newData=None, newArtist=None, nextNode=None):
        self.data = newData
        self.artist = newArtist
        self.next = nextNode

    def getData(self):
        return self.data

    def setData(self, newData):
        self.data = newData

    def getArtist(self):
        return self.artist

    def setArtist(self, newArtist):
        self.artist = newArtist

    def getNext(self):
        return self.next

    def setNext(self, newNode):
        self.next = newNode

    def delete(self):
        self.data = None
        self.artist = None

    def __str__(self):
        return "%s (%s)" % (self.data, self.artist)


class LinkedList:
    def __init__(self, newData=None, newArtist=None):
        self.head = None
        self.data = newData
        self.artist = newArtist

    def next(self, newNode, newData=None, newArtist=None):
        self.head = newNode
        self.data = newData
        self.artist = newArtist

    def delete(self, node):
        if self.head:
            n = self.head
            if n == node:
                n.delete()
                return
            while n.getNext():
                n = n.getNext()
                if n == node:
                    n.delete()
                    return

    def printAll(self):
        i = 1
        if self.head:
            node = self.head
            if node.data:
                print('1: {} - {}'.format(node.getData(), node.getArtist()))
                i += 1
            while node.getNext():
                node = node.getNext()
                if node.data:
                    print('{}: {} - {}'.format(i, node.getData(), node.getArtist()))
                    i += 1


Song1 = Node("Silent Night", "John")
Song2 = Node("Last Christmas", "Andy")
Song3 = Node("Jingle Bells", "Mary")

music_collection = LinkedList()
music_collection.next(Song1)
Song1.setNext(Song2)
Song2.setNext(Song3)
music_collection.printAll()

music_collection.delete(Song3)
music_collection.printAll()
删除最后一首歌曲时:

1: Silent Night - John
2: Last Christmas - Andy
3: Jingle Bells - Mary
解决方案2:更简单的解决方案: 仅举一个例子,看看这个:

1: Silent Night - John
2: Last Christmas - Andy
我得到了输出:

import operator

class Node(object):
    def __init__(self, name, artist):
        self.name = name
        self.artist = artist


class LinkedList(object):
    def __init__(self):
        self.list = []

    def set_next(self, node):
        self.list.append(node)

    def print(self):
        for i, node in enumerate(self.list):
            print('{}: {} - {}'.format(i+1, node.name, node.artist))

    def delete(self, node):
        self.list.remove(node)

    def sort(self, sort_by, descending=False):
        self.list.sort(key=operator.attrgetter(sort_by), reverse=descending)


Song1 = Node("Silent Night", "John")
Song2 = Node("Last Christmas", "Andy")
Song3 = Node("Jingle Bells", "Mary")
music_collection = LinkedList()
music_collection.set_next(Song1)
music_collection.set_next(Song2)
music_collection.set_next(Song3)

music_collection.sort('artist', descending=True)
music_collection.print()

我想知道是否有一种方法可以按艺术家的名字降序排列输出。例如,解决方案1的顺序是玛丽、约翰和安迪(同时仍然列出他们的歌曲名称),这真的很复杂。对于解决方案2,这将是相当容易的。如果是这样,那么我们将采取解决方案2,并从那里继续下去。
1: Jingle Bells - Mary
2: Silent Night - John
3: Last Christmas - Andy