如何为无序链表添加tail属性并优化append方法至O(1)时间复杂度?
问题描述
我需要给UnorderedList类添加tail属性,让它始终指向链表的最后一个节点,链表初始化时tail要设为None。同时要修改append方法,将其时间复杂度从O(n)优化为O(1)——具体是通过在tail后添加新节点并将tail指向新节点,但我不知道具体代码怎么写。
原有代码
class UnorderedList: def __init__(self): self.head = None def append(self, item): current = self.head if current: while current.get_next() != None: current = current.get_next() current.set_next(Node(item)) else: self.head = Node(item)
预期修改后的类结构
class UnorderedList: def __init__(self): self.head = None self.tail = None def append(self, item): current = self.tail **需要编写在tail后添加新节点并移动tail至新节点的代码**
当前完整代码
class Node: def __init__(self, node_data): self._data = node_data self._next = None def get_data(self): return self._data def set_data(self, node_data): self._data = node_data data = property(get_data, set_data) def get_next(self): return self._next def set_next(self, node_next): self._next = node_next next = property(get_next, set_next) def __str__(self): return str(self._data) class UnorderedList: def __init__(self): self.head = None self.tail = None def is_empty(self): return self.head == None def add(self, item): temp = Node(item) temp.set_next(self.head) self.head = temp def size(self): current = self.head count = 0 while current is not None: count = count + 1 current = current.next return count def append(self, item): current = self.tail if current: while current.get_next() != None: current = current.get_next() current = current.set_next(Node(item)) else: self.tail = Node(item) def search(self, item): current = self.head while current is not None: if current.data == item: return True current = current.next return False def remove(self, item): current = self.head previous = None while current is not None: if current.data == item: break previous = current current = current.next if current is None: raise ValueError("{} is not in the list".format(item)) if previous is None: self.head = current.next else: previous.next = current.next def __str__(self): result = "" node = self.head while node is not None: result += str(node.data) result += " " node = node.next return result def main(): teststring() teststring2() testappend() testappend2() def teststring(): my_list = UnorderedList() my_list.add(31) my_list.add(77) my_list.add(17) my_list.add(93) my_list.add(26) my_list.add(54) print(my_list) # should print 54 26 93 17 77 31 def teststring2(): my_list = UnorderedList() print(my_list) #should print nothing def testappend(): my_list = UnorderedList() my_list.add(31) my_list.add(77) my_list.add(17) my_list.add(93) my_list.add(26) my_list.add(54) my_list.append(51) my_list.append(22) print(my_list)#expected to print 54 26 93 17 77 31 51 22 def testappend2(): my_list = UnorderedList() my_list.append(34) print(my_list) # should print 34 if __name__ == "__main__": main()
修改后的解决方案
只需要修正UnorderedList类中的append方法即可,修改后的代码如下:
def append(self, item): new_node = Node(item) # 链表为空的情况 if self.tail is None: self.head = new_node self.tail = new_node else: # 链表不为空,直接在tail后添加新节点 self.tail.set_next(new_node) # 更新tail为新节点 self.tail = new_node
修改说明
- 移除冗余遍历:原代码中保留了遍历找最后节点的逻辑,完全没必要——因为
tail已经指向链表的最后一个节点,直接操作tail即可。 - 处理空链表场景:当链表为空时,新节点既是头节点也是尾节点,需要同时设置
self.head和self.tail,否则testappend2会输出空(因为原代码只设置了self.tail,self.head还是None)。 - 修正赋值错误:原代码中
current = current.set_next(Node(item))是错误的,set_next方法没有返回值,不需要赋值,直接调用并传入新节点即可。 - 时间复杂度优化:修改后的
append方法不需要遍历链表,直接通过tail完成添加操作,时间复杂度从O(n)降到O(1)。
替换后的完整代码可以直接通过所有测试用例,输出符合预期。
内容的提问来源于stack exchange,提问作者ty chen
相关产品推荐
相关产品推荐

