在有序链接列表中插入(Python)

时间:2015-02-11 20:41:04

标签: python python-3.x

我在为有序链接列表创建插入函数时遇到问题。以下是我到目前为止的情况:

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

    def get_data(self):
        return self.data

    def get_next(self):
        return self.next

    def set_data(self, new_data):
        self.data = new_data

    def set_next(self, new_next):
        self.next = new_next


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

    def __str__(self):
        output_string = ''

        current = self.head
        while current is not None:
            output_string += str(current.get_data())
            next_node = current.get_next()

            if next_node is not None:
                output_string += "->"

            current = next_node

        return output_string

    def insert(self, data):
        other = self.head
        previous = None
        if other is None:
            new_node = Node(data)
            new_node.set_next(self.head)
            self.head = new_node
        else:
                while data > other.get_data():
                    previous = other
                    other = other.get_next
                previous.set_next(Node(data))

2 个答案:

答案 0 :(得分:0)

我认为改变这个:

    else:
            while data > other.get_data():
                previous = other
                other = other.get_next
            previous.set_next(Node(data))

对此,应该让它发挥作用。

    else:
            # First condition will short circuit so there won't be exception on calling other.get_data() if other is None
            while other is not None and data > other.get_data():
                previous = other
                other = other.get_next()
            node = Node(data)
            node.set_next = previous.get_next()
            previous.set_next(node)

此外,python中并不一定需要getter和setter方法。 如果您需要这种行为,则惯例是使用@property注释,私有成员通常以_为前缀。

答案 1 :(得分:0)

您需要项目插入列表中。这意味着您需要:

  • 在您要插入的地方拆分链
  • 创建新节点
  • 再次使用新节点加入链中。

您在技术上不需要打破链条,因为设置previous项目上的下一个链接将清除旧链接,因此您需要做的就是再次加入链接:

while data > other.get_data():
    previous = other
    other = other.get_next()
new = Node(data)
previous.set_next(new)
new.set_next(other)

我还更正了其他错误,您没有致电 Node.get_next()

接下来,您需要更多地考虑边缘情况。当您到达链的 end 但未找到{em>任何节点node.get_data()大于插入的数据时会发生什么?

您需要调整while循环以确保测试该情况;对于链的最后一个元素,other将为None

while other is not None and data > other.get_data():
    previous = other
    other = other.get_next()
new = Node(data)
previous.set_next(new)
new.set_next(other)

您还可以采取其他措施来改进代码。在Python中不需要使用setter和getter;将属性转换为@property以后不需要花费任何费用,所以只需在此使用属性。

您还可以让Node()接受构造函数中的下一个元素,这样可以更轻松地插入元素。

您可以使用str.join()在序列的元素之间插入固定字符串。将所有data属性放入Python list并加入该列表。

创建初始元素时(self.headself.head时),您无需将None设置为下一个节点;无论如何,这是默认值:

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

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

    def __str__(self):
        data_list = []    
        current = self.head
        while current is not None:
            data_list.append(str(current.data))
            current = current.next
        return '->'.join(data_list)

    def insert(self, data):
        other = self.head
        previous = None
        if other is None:
            self.head = Node(data)
        else:
            while other is not None and data > other.data:
                previous = other
                other = other.next
            previous.next = Node(data, other)

演示:

>>> ll = LinkedList()
>>> str(ll)
''
>>> ll.insert(10)
>>> str(ll)
'10'
>>> ll.insert(20)
>>> str(ll)
'10->20'
>>> ll.insert(15)
>>> str(ll)
'10->15->20'