Leetcode707. 设计链表
创始人
2025-05-31 10:53:50
0

题目

Leetcode707. 设计链表

你可以选择使用单链表或者双链表,设计并实现自己的链表。
单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点的值,next 是指向下一个节点的指针/引用。
如果是双向链表,则还需要属性 prev 以指示链表中的上一个节点。假设链表中的所有节点下标从 0 开始。

实现 MyLinkedList 类:

  1. MyLinkedList() 初始化 MyLinkedList 对象。
  2. int get(int index) 获取链表中下标为 index 的节点的值。如果下标无效,则返回 -1 。
  3. void addAtHead(int val) 将一个值为 val 的节点插入到链表中第一个元素之前。在插入完成后,新节点会成为链表的第一个节点。
  4. void addAtTail(int val) 将一个值为 val 的节点追加到链表中作为链表的最后一个元素。
  5. void addAtIndex(int index, int val) 将一个值为 val 的节点插入到链表中下标为 index 的节点之前。
    如果 index 等于链表的长度,那么该节点会被追加到链表的末尾。如果 index 比长度更大,该节点将 不会插入 到链表中。
  6. void deleteAtIndex(int index) 如果下标有效,则删除链表中下标为 index 的节点。

题解

class MyLinkedList:def __init__(self):self.val = Noneself.next = Noneself._length = 0  # 用于记录链表长度,用于移除、插入时检查前置条件self._last = self  # 记录末尾节点节点,用于快速尾插def get(self, index: int) -> int:"""获取第index个节点的值"""if index >= self._length:return -1res = selffor _ in range(index + 1):res = res.nextreturn res.valdef addAtHead(self, val: int) -> None:"""将值为val的节点插入链表表首[由于需要插入表首,self为虚拟节点,指向当前表首]"""tmp = MyLinkedList()tmp.val, tmp.next = val, self.nextself.next = tmpif self._length == 0:self._last = tmp  # 只有一个元素,将插入的节点标记为 _lastself._length += 1  # 更新链表长度def addAtTail(self, val: int) -> None:"""尾插"""tmp = MyLinkedList()tmp.val = val# 将节点插入链表尾端,并更新 _lastself._last.next = tmpself._last = tmpself._length += 1  # 更新链表长度def addAtIndex(self, index: int, val: int) -> None:"""在指定位置插入节点 """# 插入节点索引超过链表长度if index > self._length:returnif index == 0:# 首插self.addAtHead(val)elif index == self._length:# 尾插self.addAtTail(val)else:# 插入中间节点tmp = selffor _ in range(index):tmp = tmp.nexttmp.addAtHead(val)self._length += 1  # 更新链表长度def deleteAtIndex(self, index: int) -> None:"""删除指定位置节点"""# 插入节点索引超过链表长度if index >= self._length:returnelif index == 0:# 删除首节点self.next = self.next.nextelse:tmp = selffor _ in range(index):tmp = tmp.nexttmp.next = tmp.next.nextif index == self._length - 1:self._last = tmpself._length -= 1  # 更新链表长度def print_list(self):"""打印当前链表节点,用于测试,如下所示:index 1  2 3  ...value 11 2 33 ..."""tmp = self.nextidx = 0index_str = ''val_str = ''while tmp:interval = len(str(tmp.val)) - len(str(idx))index_str = index_str + str(idx) + ' ' * (1 if interval == 0 else 1 + interval if interval > 0 else 1)val_str = val_str + str(tmp.val) + ' ' * (1 if interval == 0 else 1 + abs(interval) if interval < 0 else 1)tmp = tmp.nextidx += 1print(index_str)print(val_str)def test_run(self, exc_str_list: list, val_list: list):"""测试,用于直接输入 LeetCode 测试数据进行测试说明:测试数据第一步为新建实例,需手动新建实例并删去对应值(如下所示),再调用"""for i in range(len(val_list)):print(exc_str_list[i], val_list[i])getattr(self, exc_str_list[i])(*val_list[i])self.print_list()if exc_str_list[i] == 'get':print(f'get({val_list[i][0]}) = ', getattr(self, exc_str_list[i])(*val_list[i]))print('length = ', self._length)print('==============================================')if __name__ == '__main__':MyLinkedList().test_run(["addAtHead", "addAtIndex", "addAtIndex", "addAtHead", "deleteAtIndex", "addAtIndex", "addAtHead","addAtTail", "addAtHead", "get", "addAtTail", "addAtTail", "addAtIndex", "addAtTail", "addAtTail","addAtHead", "addAtTail", "addAtHead", "addAtTail", "addAtHead", "addAtTail", "addAtTail", "addAtHead","addAtTail", "addAtIndex", "addAtHead", "deleteAtIndex", "addAtHead", "addAtHead", "addAtHead","addAtHead", "addAtIndex", "addAtHead", "addAtTail", "addAtHead", "deleteAtIndex", "addAtTail","deleteAtIndex", "addAtTail", "addAtTail", "addAtTail", "addAtTail", "addAtHead", "addAtTail","get", "addAtIndex", "get", "deleteAtIndex", "addAtTail", "addAtHead", "addAtTail", "addAtTail","addAtIndex", "addAtHead", "addAtHead", "addAtHead", "addAtHead", "addAtHead", "addAtTail", "deleteAtIndex","deleteAtIndex", "addAtHead", "addAtHead", "addAtTail", "addAtHead", "get", "addAtIndex", "addAtIndex", "get","addAtTail", "get", "addAtTail", "deleteAtIndex", "get", "addAtTail", "addAtTail", "addAtHead", "addAtTail","deleteAtIndex", "addAtHead", "addAtHead", "addAtHead", "deleteAtIndex", "addAtTail", "addAtIndex", "addAtTail","addAtTail", "addAtIndex", "addAtIndex", "addAtHead", "addAtIndex", "addAtHead", "addAtHead", "addAtTail","addAtIndex", "addAtTail", "get", "addAtHead", "addAtTail", "addAtHead", "addAtHead"],[[86], [1, 54], [1, 14], [83], [4], [3, 18], [46], [3], [76], [5], [79], [74], [7, 28], [68],[16], [82], [24], [30], [96], [21], [79], [66], [2], [2], [7, 57], [59], [21], [19], [55], [46],[17], [16, 41], [97], [85], [63], [30], [11], [16], [91], [29], [47], [20], [12], [80], [15], [12, 8],[21], [30], [11], [54], [51], [41], [8, 88], [62], [7], [59], [73], [73], [55], [9], [7], [49], [99],[17], [44], [11], [26, 86], [10, 99], [19], [71], [29], [32], [2], [3], [16], [2], [83], [31], [3], [23],[64], [96], [27], [81], [12, 78], [21], [69], [5, 35], [8, 72], [60], [19, 73], [55], [83], [86], [31, 70],[49], [19], [64], [22], [25], [13]])

相关内容

热门资讯

1.57亿元!郑州官宣:这一补... 广大消费者、各有关汽车销售企业: 根据2025年郑州市消费品以旧换新工作安排,现统筹新增消费品以旧换...
马丁内利本场数据解析:错失良机... 在英超第16轮的较量中,阿森纳与狼队的对决以0-0平局收场,令人失望的结果让球迷们感到沮丧。尤其是阿...
力争2026年全国基本实现政策... 新华社北京12月13日电(记者彭韵佳)记者12月13日从全国医疗保障工作会议上获悉,为积极适应人口发...
江苏省人民代表大会常务委员会关... 江苏省人大常委会公告 第 47 号 《江苏省人民代表大会常务委员会关于修改〈江苏省学生体质健康促进条...
俄发动大规模空袭,摧毁多家乌军... 据新华社,根据俄罗斯国防部13日发布的战报,俄武装力量12日深夜至13日凌晨对乌克兰实施了密集火力打...
江苏省学生体质健康促进条例 目 录 第一章 总则 第二章 体育活动 第三章 卫生与营养 第四章 保障与监督 第五章 法律责任 第...
原创 越... 近年来,中美关系愈发紧张,尤其是在稀土资源的争夺上。越南作为东南亚的一颗新星,正试图借此机遇在全球稀...
关联公司混同用工的三个关键法律... 随着经济的发展,关联公司作为更具规模性和竞争性的现代企业组织型态在实践中广泛存在。关联公司是《公司法...
退休生活新指南!北京首个社管退... 12月11日,北京首个面向社会化管理退休人员的“乐活足迹”地图正式发布,标志着顺义区人力社保局在打造...
从“制度之异”到“制度之利”(... 本报记者 张 烁 贺林平 江 琳 图①:港珠澳大桥风光。 刘国兴摄(人民视觉) 图②:横琴粤澳深度...