'''
由上面单链表的操作可以看出,无论是带尾部标识,或者是循环链表,尾部插入数据的时候其时间复杂度都为O(n)
这里考虑一下,双链表。即,链表的一节,可以指向后一节数据,也可以指向前一节数据。
'''
class DNode:
def __init__(self, elem_, prev_ = None, next_ = None):
self._elem = elem_
self._prev = prev_
self._next = next_
class DLList:
def __init__(self, head_ = None, rear_ = None):
self._head = head_
self._rear = rear_
# 判断链表是否为空
def is_empty(self):
return self._head is None
# 从链表前插入数据
def prepend(self, elem):
p = DNode(elem, prev_ = None, next_ = self._head)
if self.is_empty():
self._rear = p
else:
p._next = self._head
self._head._prev = p
self._head = p
# 从链表后插入数据
def append(self, elem):
p = DNode(elem, prev_ = self._rear, next_ = None)
if self.is_empty():
self._head = p
else:
self._rear._next = p
self._rear = p
# 从链表的头部删除数据
def pop(self):
if self.is_empty():
raise ValueError("链表为空")
if self._head is self._rear:
e = self._head._elem
self._head = None
self._rear = None
else:
e = self._head._elem
self._head = self._head._next
self._head._prev = None
return e
def pop_last(self):
if self.is_empty():
raise ValueError("链表为空")
if self._head is self._rear:
e = self._head._elem
self._head = None
self._rear = None
else:
e = self._rear._elem
self._rear = self._rear._prev
self._rear._next = None
return e
def __str__(self):
if self.is_empty():
return ""
part = ""
p = self._head
while p._next:
part += str(p._elem) + ", "
p = p._next
part += str(self._rear._elem)
return part
# 对链表进行反转操作, 这种换数据的方法比前面文章1的方法,利用前方向指针,将时间复杂度降到O(1)
# 至于改变链表结构的方法,好像跟文章1的方式基本相同
def reverse1(self):
# 当链表为空或者只有一个数据时,不需要反转
if self.is_empty() or self._head is self._rear:
return
p = self._head
q = self._rear
while True:
if p is q:
break
elif p._next is q:
p._elem, q._elem = q._elem, p._elem
break
else:
p._elem, q._elem = q._elem, p._elem
p = p._next
q = q._prev
# 至于排序操作,跟文章1的方式基本相同
data = DLList()
for i in range(10):
data.prepend(i)
print(data, "\n--------------\n")
data.reverse1()
print(data)
python数据结构之链表操作-----双链表4
最新推荐文章于 2023-05-23 09:38:45 发布