04 双向链表
# encoding: utf-8
class Node(object):
"""节点"""
def __init__(self, item):
self.item = item
self.prev = None
self.next = None
# 继承单链表 复用代码
class DoubleLinkList(SingleLinkList):
"""双链表"""
# def __init__(self):
# # 头部节点 私有属性
# self._head = None
# def is_empty(self):
# """链表是否为空"""
# return self._head is None
# def length(self):
# """链表长度"""
# # cur 游标 用来移动遍历节点
# cur = self._head
# count = 0
# while cur != None:
# count += 1
# cur = cur.next
# return count
# def travel(self):
# """遍历整个链表"""
# # cur 游标 用来移动遍历节点
# cur = self._head
# while cur != None:
# print(cur.item)
# cur = cur.next
def add(self, item):
"""链表头部添加元素"""
# 1.正常 2.空
node = Node(item)
if self.is_empty():
# 空 头指向node
self._head = node
else:
# node的next 指向头节点
node.next = self._head
# 头节点的prev指向node
self._head.prev = node
# 头指向node
self._head = node
def append(self, item):
"""链表尾部添加元素"""
# 1.正常 2.空
node = Node(item)
if self.is_empty():
# 空 头指向node
self._head = node
else:
# cur 指向尾节点
cur = self._head
while cur.next is not None:
cur = cur.next
# 尾节点的next指向node
cur.next = node
# node的prev指向尾节点
node.prev = cur
def insert(self, pos, item):
"""链表指定位置添加元素"""
# 1.头 2.尾 3.中间
if pos <= 0:
self.add(item)
elif pos >= self.length():
self.append(item)
else:
node = Node(item)
# pre 指向插入位置的前一位节点
pre = self._head
# num 表示pre的位置
num = 0
while num < (pos - 1):
pre = pre.next
num += 1
# node的next指向插入位置的节点
node.next = pre.next
# 插入位置的节点的prev指向node
pre.next.prev = node
# node的prev指向pre
node.prev = pre
# pre的next指向node
pre.next = node
def remove(self, item):
"""删除元素"""
# 1.找到了 2.没找到
# 1.1 在头部 1.2 不在头部
# 1.1.1 只有头 1.1.2 还有其他
# 1.2.1 在中间 1.2.2 在尾部
cur = self._head
while cur is not None:
# 找到了
if cur.item == item:
# 1.1 在头部
if cur == self._head:
self._head = cur.next
# 判断是否还有其他节点
if cur.next:
# 头节点的后一个节点的pre指向None
cur.next.prev = None
# 1.2 不在头部
else:
# cur的前一个节点的next指向cur的后一个节点
cur.prev.next = cur.next
# 判断是否在中间
if cur.next:
# cur的后一个节点的prev指向cur的前一个节点
cur.next.prev = cur.prev
break
# 没找到
else:
cur = cur.next
def search(self, item):
"""查找元素是否存在"""
cur = self._head
while cur is not None:
if cur.item == item:
return True
cur = cur.next
return False