双链表,节点之间具有双向链接,即在每个节点都有前和后两个指针,分别指向前一个节点和后一个节点。
节点类:
class Node(object):
def __init__(self, elem, next_=None, prev=None):
self.elem = elem
self.next = next_
self.prev = prev
双链表:
class LinkedList(object):
def __init__(self):
self.head = None
def is_empty(self):
return self.head is None
def length(self):
"""链表长度"""
count = 0
pointer = self.head
while pointer is not None:
pointer = pointer.next
count += 1
return counter
def search(self, elem):
"""搜索"""
if self.is_empty():
return -1
p = self.head
while p is not None:
if p.elem == elem:
return p.elem
p = p.next
return -1
def add(self, elem):
"""首部插入"""
node = Node(elem)
if self.is_empty():
self.head = node
else:
node.next = self.head
self.head.prev = node
self.head = node
def append(self, elem):
"""尾部插入"""
node = Node(elem)
if self.is_empty():
self.head = node
else:
p = self.head
while p.next:
p = p.next
p.next = node
node.next = p
def insert(self, pos):
"""一般位置插入"""
if pos <= 0:
self.add(elem)
elif pos > self.length():
self.append(elem)
else:
node = Node(elem)
idx = 0
p = self.head
while idx <= pos - 1:
idx += 1
p = p.next
node.next = p.next
p.next.prev = node
node.prev = p
p.next = node
def pop(self):
"""弹出尾部元素"""
if self.is_empty():
return -1
p = self.head
while p.next:
p = p.next
elem = p.next.elem
p.next.prev = None
p.next = None
return elem
def pop_first(self):
"""弹出第一个节点"""
if self.is_empty():
return -1
if not self.head.next:
elem = self.head.elem
self.head = None
return elem
else:
elem = self.head.elem
p = self.head.next
p.prev = None
self.head.next = None
self.head = p
return elem
def delete(self, pos):
"""删除指定节点"""
if pos <= 0:
return self.pop_first()
if pos >= self.length() - 1:
return self.pop()
p = self.head
idx = 0
while idx <= pos-1:
idx += 1
p = p.next
p.prev.next = p.next
p.next.prev = p.prev
p.next = None
p.prev = None
def travel(self):
"""遍历"""
p = self.head
while p:
print(p.elem)
p = p.next
def reverse(self):
"""反转"""
if self.is_empty():
return -1
p = self.head
while p:
p_next = p.next
p.next = p.prev
p.prev = p_next
p = p_next
if p:
self.head = p
def sort(self):
"""排序
采用插入排序算法,交换指针
"""
if self.is_empty():
return -1
if not self.head.next:
return -1
p_prev = self.head
p = p_prev.next
p_prev.next = None
while p:
h = self.head
q = None
while h and h.elem <= p.elem:
q = h
h = h.next
p_next = p.next
p.next = h
p.prev = q
if q is not None:
q.next = p
else:
self.head = p
p = p_next