You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为无序链表添加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

修改说明

  1. 移除冗余遍历:原代码中保留了遍历找最后节点的逻辑,完全没必要——因为tail已经指向链表的最后一个节点,直接操作tail即可。
  2. 处理空链表场景:当链表为空时,新节点既是头节点也是尾节点,需要同时设置self.head和self.tail,否则testappend2会输出空(因为原代码只设置了self.tail,self.head还是None)。
  3. 修正赋值错误:原代码中current = current.set_next(Node(item))是错误的,set_next方法没有返回值,不需要赋值,直接调用并传入新节点即可。
  4. 时间复杂度优化:修改后的append方法不需要遍历链表,直接通过tail完成添加操作,时间复杂度从O(n)降到O(1)。

替换后的完整代码可以直接通过所有测试用例,输出符合预期。

内容的提问来源于stack exchange,提问作者ty chen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 00:25:21