文章目录
一、前言
笔者在前面已经介绍过了栈的实现和队列的实现,本文则是介绍链表的实现,包括单向链表和双向链表的实现。希望能够给初学python算法和数据结构的小伙伴提供帮助~
二、单链表的实现
首先看下单链表的实现,通常单链表中的节点一般包含两个属性,一是存储该节点的数据,二是指向下一节点的指针。因此,在实现单链表之前,我们需要定义如下的 单链表节点
。
class SingleLinkNode:
"""
Single Link Node definition
"""
def __init__(self, data=None):
self.data = data
self.next = None
定义好单链表节点之后,接下来就是对单链表进行实现了。这里实现的单链表主要包含以下几个操作:在单链表末尾添加元素
(append方法)、在单链表指定位置插入元素
(insert方法)、删除单链表中第一个出现的指定元素
(remove方法)、获取单链表中某个位置的元素值
(getValue方法)、清空单链表
(clear方法)、反转单链表
(reverse方法)、获取单链表中元素个数
(length方法)、判断单链表是否为空
(isEmpty方法)、打印整个单链表
(print_all方法)。以下是上面所有方法的实现代码,值得注意的是在 insert 和 getValue 方法中,需要对 index 为负数的情况进行处理下(即加上单链表的长度),因为理论上索引是支持负数的。
class SingleLinkList:
"""
Single Link List implement
"""
def __init__(self):
"""
Initialize an empty pointer
"""
self.__head = None
def append(self, obj):
"""
append an element at tail
:param obj: object for appending
"""
node = SingleLinkNode(obj)
if self.isEmpty():
self.__head = node
else:
curr = self.__head
while curr.next:
curr = curr.next
curr.next = node
def insert(self, obj, index):
"""
insert an element at specific position
:param obj: object for inserting
:param index: target position
"""
node = SingleLinkNode(obj)
if self.isEmpty():
self.__head = node
else:
length = self.length()
index = index if index >= 0 else length + index
# insert at the first position
if index == 0:
curr = self.__head
node.next = curr
self.__head = node
elif 0 < index < length:
count = 1
curr = self.__head
while curr.next:
if count == index:
node.next = curr.next
curr.next = node
break
else:
count +=