1 双向链表结构分析
一种更复杂的链表是“双向链表”或“双面链表”。每个节点有两个链接:一个指向前一个节点,当此节点为第一个节点时,指向空值;而另一个指向下一个节点,当此节点为最后一个节点时,指向空值。
2 实现方法
is_empty() 链表是否为空
length() 链表长度
travel() 遍历链表
add(item) 链表头部添加
append(item) 链表尾部添加
insert(pos, item) 指定位置添加
remove(item) 删除节点
search(item) 查找节点是否存在
3 代码实现
# 如果要直接使用可以使用deque创建队列(也就是链表)
# 2 节点实现
class Node(object):
"""单链表的结点"""
def __init__(self, item):
# item存放数据元素
self.item = item
# next是下一个节点的标识
self.next = None
# 双向链表多了一个pre,指向上一个节点
self.prev = None
# 链表实现
class DLinkList(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
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():
self.__head = node
else:
node.next = self.__head
self.__head.prev = node
self.__head = node
def append(self, item):
"""尾部添加元素"""
node = Node(item)
# 如果链表为空,将链表头指向node
if self.is_empty():
self.__head = node
# 不为空的情况下,找到最后一个节点,将他的next链接到node
else:
cur = self.__head
while cur.next != None:
cur = cur.next
cur.next = node
node.prev = cur
插入节点
def insert(self, pos, item):
"""指定位置添加元素"""
if pos <= 0:
self.add(item)
elif pos > (self.length() - 1):
self.append(item)
else:
node = Node(item)
cur = self.__head
count = 0
while count < (pos - 1):
count += 1
cur = cur.next
node.prev = cur
node.next = cur.next
cur.next.prev = node
cur.next = node
删除元素
def remove(self, item):
"""删除节点"""
cur = self.__head
while cur != None:
if cur.item == item:
# 判断删除的节点是不是第一个,如果是第一个,pre为None,下面条件成立
if cur == self.__head:
self.__head == cur.next
if cur.next:
cur.next.prev = None
else:
cur.prev.next = cur.next
if cur.next:
cur.next.prev = cur.prev
break
else:
cur = cur.next
def search(self, item):
"""查找节点是否存在"""
cur = self.__head
while cur != None:
if cur.item == item:
return True
cur = cur.next
return False
效果演示
if __name__ == '__main__':
ll = DLinkList()
ll.add(1)
ll.add(2)
ll.append(3)
ll.insert(2, 4)
ll.insert(4, 5)
ll.insert(0, 6)
print("length:", ll.length())
ll.travel()
print(ll.search(3))
print(ll.search(4))
ll.remove(1)
print("length:", ll.length())
ll.travel()
length: 6
6
2
1
4
3
5
True
True
length: 5
6
2
4
3
5