链表
由于线性表在计算机内存里是连续、静态存放相关元素的,受内存连续存放字节限制,所以存在一些缺陷。
- 插入和删除线性表时,在袁元素比较多的情况下,需要在内存里移动大量的元素。
- 内存空间容易碎片化,由于线性表是固定长度,有长有短,所以导致部分空间无法利用。
- 线性表记录数据过大时,容易造成无法确定内存的容量。
为此引入更加合理、灵活利用内存空间的数据结构——链表(Linked List)。
# -*- coding:utf-8 -*-
"""
作者:bug君
日期:2023年 04月 08日
标题:
作用:构建链表,访问链表值,打印节点个数
思路:利用Node()类建立一个节点的数据结构,含date和next
利用LinkedList()类构建链表,并提供遍历打印数值、统计链表节点的方法
"""
class Node:
def __init__(self, data=None, next=None): # 利用面向对象的封装特性,将节点的属性定义为私有
self._elem = data
self._next = next
def setData(self, NewData):
self._elem = NewData
def setNext(self, NewNext):
self._next = NewNext
def getData(self):
return self._elem
def getNext(self):
return self._next
class LinkedList:
def __init__(self):
self._head = Node()
self._length = 0
def tail_add(self, NewData): # 向链表尾添加元素
NewNode = Node(NewData)
if self._length == 0:
self._head = NewNode
else:
curNode = self._head
while curNode.getNext(): # 遍历到结尾元素
curNode = curNode.getNext()
curNode.setNext(NewNode)
self._length += 1
def PrintLinkedList(self): # 遍历并打印节点数值
curNode = self._head
while curNode: # 这里跟上面 末尾添加元素不同, 需要遍历完链表全部元素
print(f'打印节点 : {curNode.getData()}')
curNode = curNode.getNext()
def getLength(self):
return self._length
if __name__ == '__main__':
foods = ['apple', 'water', 'juice', 'tomato']
newLinked = LinkedList()
for food in foods:
newLinked.tail_add(food)
print(newLinked.getLength())
newLinked.PrintLinkedList()