前置疑问
Q1 C语言中实现单链表需要用到结构体,python中如何实现?
Q2 面向过程和面向对象实现一个单链表到底有什么不同的感受?
学习内容
1、定义单链表
2、单链表的实现
3、单链表的方法
4、单链表和顺序表的区别
学习时突发疑问
Q3 python中实现链表的时候,为什么要定义两个类Node一个SingleList
Q4 current和current.next 分别代表什么?
Q5 什么时候用current?什么时候用current.next?
学习产出
1、定义单链表
- 单链表是线性表,一个单链表是由一个一个节点构成,每个节点有两个域,一个数据域,一个指针域。
- “链”表示是一个接着一个,如何实现这种表示,前面一个节点指针域存放后一个节点的地址。谁在谁前面就是前驱,谁在谁后面就是后继,头节点不存在前驱,尾结点不存在后继。
2、单链表的实现
A1
- 节点的表示
用C语言面向过程表示,可以用typedef + struct 来表示一个节点如下:
typedef struct node
{
ElemType data;
struct node *next;
}Node, *LinkList;
但是刚学完python如何实现这个节点呢?用类,造一个出来
class Node:
def __init__(self, data):
self.data = data
self.next = None
- 链表的表示
C语言中用如下方法表示创建好了一个链表L
LinkList L = (LinkList)malloc(sizeof(Node));
L->next = NULL
class SingleList:
"""实现单链表"""
def __init__(self, node=None):
self._head = node
my_list = SingleList()
图片由python Tutor生成
A3
为什么要创建两个类呢?因为最终的操作是只用链表这个对象去操作里面的节点,节点是一个对象,需要一个类,链表也是个对象,也需要个类。
3、单链表的常规操作
- is_empty
'''判断链表是否为空'''
def is_empty(self):
return self._head is None
- length
def length(self):
current = self._head
count = 0
while current is not None:
count += 1
current = current.next
return count
- travel
'''遍历链表'''
def travel(self):
current = self._head
while current is not None:
print("{0}".format(current.data), end=" ")
current = current.next
print(" ")
- add
'''在链表头部插入节点,头插法'''
def add(self, item):
node = Node(item)
if self.is_empty():
self._head = node
else:
node.next = self._head
self._head = node
- append
'''在链表尾部插