python3实现单向链表
#######最近重学数据结构,无奈c语言已经忘得一干二净,所以干脆用python来写。
一、代码结构:
- 节点类
- 单向列表类
- 链表初始化操作
- __init__ 初始化链表
- is_empty 判断链表是否为空
- get_len 获取链表的长度
- clear_list 清除列表
- 增加节点
- append 从链表尾部添加节点
- insert 在链表的任意位置插入节点
- 删除节点
- remove 删除节点内容 为data的所有节点
- pop 删除第i个节点并且返回节点的内容
- 查看节点
- get_data 查看第i个节点的内容
二、代码如下:
#-*- coding:utf-8 -*- #Author: Bing Xu class Node(object): def __init__(self,data): self.data = data self.next = None class Single_Linklist(object): def __init__(self): ''' 链表初始化 ''' self.head_node = None def is_empty(self): ''' 判断链表是否为空 :return: ''' return self.head_node == None def get_len(self): ''' 获取链表对象的长度 :return: 链表长度 ''' counter = 0 cur = self.head_node while cur: counter += 1 cur = cur.next return counter def clear_list(self): ''' 清除链表所有元素 :return: 空链表 ''' self.head_node = None def append(self,data): ''' 链表尾部追加节点 :param data: 追加节点的内容 :return: ''' node = Node(data) if self.is_empty(): self.head_node = node else: cur = self.head_node while cur.next: cur = cur.next cur.next = node def insert(self,i,data): ''' 插入新的节点 :param i: 待插入的位置,0 <= i <= self.length :param data: 待插入的节点数据 :return: ''' node = Node(data) length = self.get_len() cur = self.head_node if length >= i: if i == 0: self.head_node = node node.next = cur else: for item in range(i-1): cur = cur.next temp = cur.next cur.next = node node.next = temp else: return False def remove(self,data): ''' 删除链表内容为data的所有节点 :param data: 要删除的内容 :return: ''' cur = self.head_node if cur.data == data: self.head_node = cur.next return else: while cur.next: # temp = cur # cur = cur.next temp,cur = cur,cur.next if cur.data == data: temp.next = cur.next def pop(self,i): ''' 删除链表对象第i个节点并返回该节点内容 :param i: 要删除的节点,0 <= i < self.length :return: 删除节点的内容 ''' length = self.get_len() cur = self.head_node if i == 0: Data = cur.data self.head_node = cur.next return Data elif i < length: for j in range(i): temp, cur = cur, cur.next Data = cur.data temp.next = cur.next return Data def reset_data(self,i,data): ''' 修改第i个节点的内容 :param i: 要修改的节点,0 <= i < self.length :param data: 修改后的内容 :return: ''' cur = self.head_node if 0 <= i < self.get_len(): for j in range(i): cur = cur.next cur.data = data else: return False def get_data(self,i): ''' 获取链表第i个的值 :param i: 0 <= i < self.length :return: 节点的内容 ''' cur = self.head_node if 0 <= i < self.get_len(): for j in range(i): cur = cur.next return cur.data else: return False
三、代码测试:
链表初始化:
sin_list = Single_Linklist() print(sin_list.get_len()) print(type(sin_list)) 结果为: 0 <class '__main__.Single_Linklist'>
增:
for i in range(10): sin_list.append(i) sin_list.insert(0,'insert') print(sin_list.get_len()) for j in range(sin_list.get_len()): #遍历打印 print(sin_list.get_data(j),end=',') 结果: 11 insert,0,1,2,3,4,5,6,7,8,9,
删:
for i in range(10): sin_list.append(i) sin_list.remove(0) sin_list.pop(sin_list.get_len()-1) for j in range(sin_list.get_len()): #遍历打印 print(sin_list.get_data(j),end=',') 结果: 1,2,3,4,5,6,7,8,
改:
for i in range(10): sin_list.append(i) sin_list.reset_data(0,'修改') sin_list.reset_data(9,'完成') for j in range(sin_list.get_len()): #遍历打印 print(sin_list.get_data(j),end=',') 结果: 修改,1,2,3,4,5,6,7,8,完成,