好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Python实现双向链表基本操作

双向链表的基本操作的实现,供大家参考,具体内容如下

在之前的博客中介绍了三种链表,分别是单链表、单向循环链表以及双向链表。本篇博客将用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实现双向链表基本操作的详细内容...

  阅读:52次