双向链表的基本操作的实现,供大家参考,具体内容如下
在之前的博客中介绍了三种链表,分别是单链表、单向循环链表以及双向链表。本篇博客将用Python来实现双向链表的如下操作。(用到的工具是Python 3)
is_empty() : 判断链表是否为空
length() : 返回链表的长度
travel() : 遍历
add(item) : 在头部添加一个节点
append(item) : 在尾部添加一个节点
insert(pos, item) : 在指定位置 pos 添加一个节点
remove(item) : 删除一个节点
search(item) : 查找节点是否存在Python实现
class Node(object): ?? ?'''双向链表节点''' ?? ?def __init__(self,item): ?? ??? ?self.item = item ?? ??? ?self.next = None ?? ??? ?self.prev = None class DoubleLink(object): ?? ?'''双向链表''' ?? ?def __init__(self): ?? ??? ?self._head = None ?? ? ?? ?def is_empty(self): ?? ??? ?'''判断是否为空''' ?? ??? ?return self._head == None ?? ? ?? ?def length(self): ?? ??? ?'''返回链表的长度''' ?? ??? ?cur = self._head ?? ??? ?count = 0 ?? ??? ?while cur!= None: ?? ??? ??? ?count += 1 ?? ??? ??? ?cur = cur.next ?? ??? ?return count ?? ? ?? ?def travel(self): ?? ??? ?'''遍历链表''' ?? ??? ?cur = self._head ?? ??? ?while cur != None: ?? ??? ??? ?print(cur.item) ?? ??? ??? ?cur = cur.next ?? ??? ?print("") ?? ? ?? ?def add(self, item): ?? ??? ?'''头部插入元素''' ?? ??? ?node = Node(item) ?? ??? ?if self.is_empty(): ?? ??? ??? ?# 如果是空链表,将_head指向None ?? ??? ??? ?self._head = node ?? ??? ?else: ?? ??? ??? ?# 将node的next指向_head的头节点 ?? ??? ??? ?node.next = self._head ?? ??? ??? ?# 将_head的头节点的prev指向node ?? ??? ??? ?self._head.prev = node ?? ??? ??? ?# 将_head 指向node ?? ??? ??? ?self._head = node ?? ? ?? ?def append(self, item): ?? ??? ?'''尾部插入元素''' ?? ??? ?node = Node(item) ?? ??? ?if self.is_empty(): ?? ??? ??? ?self._head = node ?? ??? ?else: ?? ??? ??? ?# 移动到链表尾部 ?? ??? ??? ?cur = self._head ?? ??? ??? ?while cur.next != None: ?? ??? ??? ??? ?cur = cur.next ?? ??? ??? ?# 将尾结点cur的next指向node ?? ??? ??? ?cur.next = node ?? ??? ??? ?# 将node的prev指向cur ?? ??? ??? ?node.prev = cur ?? ? ?? ?def search(self, item): ?? ??? ?'''查找元素是否存在''' ?? ??? ?cur = self._head ?? ??? ?while cur != None: ?? ??? ??? ?if cur.item == item: ?? ??? ??? ??? ?return True ?? ??? ??? ?cur = cur.next ?? ??? ?return False指定位置插入节点
在该操作中,要注意链的指向的先后顺序。
def insert(self, pos, item): ?? ??? ?'''在指定位置添加节点''' ?? ??? ?if pos <= 0: ?? ??? ??? ?self.add(item) ?? ??? ?elif pos > (self.length() - 1): ?? ??? ??? ?self.append(item) ?? ??? ?else: ?? ??? ??? ?node = Node() ?? ??? ??? ?cur = self._head() ?? ??? ??? ?count = 0 ?? ??? ??? ?# 移动到指定的前一个位置 ?? ??? ??? ?while cur < pos - 1 : ?? ??? ??? ??? ?count += 1 ?? ??? ??? ??? ?cur = cur.next ?? ??? ??? ?# 将node的prev指向cur ?? ??? ??? ?node.prev = cur ?? ??? ??? ?# 将node的next指向cur的下一个节点 ?? ??? ??? ?node.next = cur.next ?? ??? ??? ?# 将cur的下一个节点的prev指向node ?? ??? ??? ?cur.next.prev = node ?? ??? ??? ?# 将cur.next指向node ?? ??? ??? ?cur.next = node删除元素
def remove(self, item): ?? ??? ?'''删除元素''' ?? ??? ?if self.is_empty(): return? ?? ??? ?else: ?? ??? ??? ?cur = self._head ?? ??? ??? ?if cur.item == item: ?? ??? ??? ??? ?# 如果首节点的元素是要删除的元素 ?? ??? ??? ??? ?if cur.next == None: ?? ??? ??? ??? ??? ?# 如果链表中只有一个节点 ?? ??? ??? ??? ??? ?self._head = None ?? ??? ??? ??? ?else: ?? ??? ??? ??? ??? ?cur.next.prev = None ?? ??? ??? ??? ??? ?self._head = cur.next ?? ??? ??? ??? ?return ?? ??? ??? ?while cur != None: ?? ??? ??? ??? ?if cur.item == item: ?? ??? ??? ??? ??? ?cur.prev.next = cur.next ?? ??? ??? ??? ??? ?cur.next.prev = cur.prev ?? ??? ??? ??? ??? ?break ?? ??? ??? ??? ?cur = cur.next以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
查看更多关于Python实现双向链表基本操作的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did17022