Python中的排序链接列表

时间:2013-10-07 05:28:52

标签: data-structures python-3.x

我在弄清楚如何在Python中对单链接列表进行排序时遇到了一些麻烦。我已经想出了如何创建链接列表并将数据推送到它上但是如何以排序格式推送它(在所有数据被推到它之后不进行排序)或者只是以任何方式对其进行排序?

目的

根据用户输入创建一个已排序的单链数字列表。 程序逻辑: 询问一个数字,将该数字添加到排序位置的列表中,打印列表。 重复,直到他们为数字输入-1。

当前代码

#!/usr/bin/env python

class node:
    def __init__(self):
        self.data = None # contains the data
        self.next = None # contains the reference to the next node


class linked_list:
    def __init__(self):
        self.cur_node = None

    def add_node(self, data):
        new_node = node() # create a new node
        new_node.data = data
        new_node.next = self.cur_node # link the new node to the 'previous' node.
        self.cur_node = new_node #  set the current node to the new one.

    def list_print(self):
        node = self.cur_node # cant point to ll!
        while node:
            print(node.data)
            node = node.next


def main():
  ll = linked_list()

  num=int(input("Enter a num to push onto the list, -1 to stop: "))
  while num!=-1:
    data=num
    ll.add_node(data)
    num=int(input("Enter a num to push onto the list, -1 to stop: "))

  print("\n")
  ll.list_print()
main()

我真的被困在这里了。提前感谢您的帮助!

5 个答案:

答案 0 :(得分:7)

这应该这样做:

>>> class Node:
...   def __init__(self):
...     self.data = None
...     self.next = None
... 
>>> class LinkedList:
...   def __init__(self):
...     self.head = None
...   
...   def addNode(self, data):
...     curr = self.head
...     if curr is None:
...       n = Node()
...       n.data = data
...       self.head = n
...       return
...     
...     if curr.data > data:
...       n = Node()
...       n.data = data
...       n.next = curr
...       self.head = n
...       return
...     
...     while curr.next is not None:
...       if curr.next.data > data:
...         break
...       curr = curr.next
...     n = Node()
...     n.data = data
...     n.next = curr.next
...     curr.next = n
...     return
...   
...   def __str__(self):
...     data = []
...     curr = self.head
...     while curr is not None:
...       data.append(curr.data)
...       curr = curr.next
...     return "[%s]" %(', '.join(str(i) for i in data))
...   
...   def __repr__(self):
...     return self.__str__()
... 
>>> def main():
...   ll = LinkedList()
...   num = int(input("Enter a number: "))
...   while num != -1:
...     ll.addNode(num)
...     num = int(input("Enter a number: "))
...   c = ll.head
...   while c is not None:
...     print(c.data)
...     c = c.next
... 
>>> main()
Enter a number: 5
Enter a number: 3
Enter a number: 2
Enter a number: 4
Enter a number: 1
Enter a number: -1
1
2
3
4
5

答案 1 :(得分:1)

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

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

    def asc_ordered_list(self, data):
        new_node = Node(data)
        if self.head is None:
            self.head = new_node
            return

        temp = self.head
        if temp.data > data:
            new_node.next = temp
            self.head = new_node
            return

        while temp.next:
            if temp.next.data > data:
                break
            temp = temp.next

        new_node.next = temp.next
        temp.next = new_node

    def desc_ordered_list(self, data):
        new_node = Node(data)
        if self.head is None:
            self.head = new_node
            return

        temp = self.head
        if data > temp.data:
            new_node.next = temp
            self.head = new_node
            return

        while temp.next:
             if temp.data > data and temp.next.data < data:
                 break
             temp = temp.next

        new_node.next = temp.next
        temp.next = new_node

    def display_list(self):
        temp = self.head
        while temp is not None:
            print("data = {0}".format(temp.data))
            temp = temp.next

if __name__ == "__main__":
    llist = LinkedList()
    llist.desc_ordered_list(8)
    llist.desc_ordered_list(3)
    llist.desc_ordered_list(1)
    llist.desc_ordered_list(4)
    llist.desc_ordered_list(5)
    llist.desc_ordered_list(7)
    llist.desc_ordered_list(6)
    llist.desc_ordered_list(2) 
    llist.display_list()

答案 2 :(得分:0)

我认为这有点短而且容易

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

def main():
    nodes = []
    num = int(input("Enter number: "))
    while num != -1:
        nodes.append(Node(num))
        num = int(input("Enter number: "))

    # If list is empty then just end function
    if len(nodes) == 0: 
        return

    # Let python do the sorting
    nodes = sorted(nodes, key=lambda node: node.data)

    # Link the nodes together and print them while you're at it
    for i in range(len(nodes) - 1):
        nodes[i].next = nodes[i + 1]
        print(nodes[i].data)
    # We need to print the last node
    print(nodes[-1].data)

答案 3 :(得分:0)

class Solution:
    def sortList(self,node):

        if(node is None):
            return
        temp=node
        while(temp!=None):
            i=temp.next
            while(i!=None):
                if(temp.data>i.data):
                    n=i.data
                    i.data=temp.data
                    temp.data=n
                i=i.next
            temp=temp.next

答案 4 :(得分:0)

4 年后,但我认为这样更容易

 def append(self, value):
    new_node = Node(value)
    if self.head is None:
        self.head = new_node
    else:
        current = self.head
        while current is not None and current.value <= value:
            previous = current
            current = current.next
        if current is self.head:
            aux = self.head
            self.head = new_node
            new_node.next = aux
        else:
            previous.next = new_node
            new_node.next = current
    self.size += 1