今天复习了下 Python 基础, 顺表研究了下链表。链表真的非常非常重要滴,它是一种动态的线性数据结构,它是后面二分搜索树,红黑树巴拉巴拉的的基础,必须掌握。重要的事情说三遍。
学好链表!!!
学好链表!!!
学好链表!!!
不得不说, 用 Python 实现链表是真的爽。代码结构看着非常清晰明了。
链表有几个重要的特性,搞明白了这个,实现的逻辑就更加好写。
- 链表是由节点组成,一个节点包含两个部分,一个数数据域,用来存储数据信息,另一个是指针域,用来存储指向下一个元素的指针
- 它是一种递归的结构,对于后面的树的实现就是基于链表的混合组成,对于某些操作,它比数组的时间复杂度要低
- 链表的第一个节点的数据为空,最后一个节点的指针域为空
- 链表的优点是实现了真正的动态,不需要处理固定容量的问题,缺点:它丧失了随机访问的能力。
节点的定义类如下
class Node(object):
'''
data 保存节点的数据
next 保存下一个节点对象
'''
def __init__(self, data):
self.data = data
self.next = None  
复制代码
然后,定义 LinkedList 的实现类
class LinkedList(object):
def __init__(self, head=None):
self.head = head
def __len__(self):
# 输入头节点, 返回链表的长度
curr = self.head
counter = 0
while curr is not None:
counter += 1
curr = curr.next
return counter
def addFirst(self, data):
node = Node(data)
node.next = self.head
self.head = node
def append(self, data):
# 若数据为空 ,则返回 None
if data is None:
return None
# 若头节点为空,直接将输入数据作为头节点
node = Node(data)
if self.head is None:
self.head = node
return node
curr_node = self.head
while curr_node.next is not None:
curr_node = curr_node.next
curr_node.next = node
return node
# 向任意位置插入一个数据
def insert(self, index, data):
prev_node = self.head
for i in range(index):
prev_node = prev_node.next
node = Node(data)
node.next = prev_node.next
prev_node.next = node
# 查找某个节点,时间复杂度为 O(n)
def search(self, data):
curr_node = self.head
while curr_node is not None:
if curr_node.data == data:
return curr_node
curr_node = curr_node.next
return curr_node
def getIndex(self, data):
curr_node = self.head
i = 0
while curr_node is not None:
if curr_node.data == data:
return i
curr_node = curr_node.next
i += 1
return '这个数不存在'
def getItem(self, index):
i = 0
curr_node = self.head
while curr_node is not None:
if i == index:
return curr_node.data
curr_node = curr_node.next
i += 1
return None
if __name__ == '__main__':
# node1 = Node(1)
# node2 = Node(2)
# node3 = Node(3)
# node1.next = node2
# node2.next = node3
# node = node1
# while node:
# print(node.data)
# node = node.next
linklist = LinkedList()
for i in range(9):
linklist.append(i)
print(linklist.__len__())
linklist.addFirst(10)
print(linklist.getIndex(10))
print(linklist.getItem(0))
print('='*30)
linklist.insert(5, 50)
curr = linklist.head
while curr is not None:
print(curr.data)
curr = curr.next复制代码