Python数据结构和算法单链表和循环链表的定义和使用示例
示例从Python数据结构和算法中描述了链表的定义和使用。
(1) 根据链表节点的定义,以面向类和面向对象的方式设计链表。
(2)实现链表类的插入、删除等成员函数时要考虑的前提条件,
prepend(头插入)、pop(头删除)、append(尾插入)、pop_last(去掉尾) )
2.1 插入:
空链表
链表长度为1
插入到末尾
2.2删除 2.2删除 空链表 (3) 从单链表到单链表的多种变化: 带尾节点的单链表 1。链表节点的定义 2。单链表的实现 重点了解插入和删除的实现以及需要考虑的前提条件: 简单总结: (0) 访问p.next.next的条件是p。 next 不为空; 单链表的简单变体:带尾节点的单链表 我们只需重写为:插入头、插入尾部、删除尾部 单链表的变体:循环单链表
链表长度列表为 1
删除最后一个元素
循环单链表
双向链表 class LNode:
def __init__(self, elem, next_=None):
self.elem = elem
self.next = next_
class LinkedListUnderflow(ValueError):
pass
class LList:
def __init__(self):
self._head = None
def is_empty(self):
return self._head is None
def prepend(self, elem):
self._head = LNode(elem, self._head)
def pop(self):
if self._head is None:
raise LinkedListUnderflow('in pop')
e = self._head.elem
self._head = self._head.next
return e
def append(self, elem):
if self._head is None:
self._head = LNode(elem)
return
p = self._head
while p.next is not None:
p = p.next
p.next = LNode(elem)
def pop_last(self):
if self._head is None:
raise LinkedListUnderflow('in pop_last')
p = self._head
if p.next is None:
e = p.elem
self._head = None
return e
while p.next.next is not None:
p = p.next
e = p.next.elem
p.next = None
return e
(1)尾插入,如果链表不为空,则唯一需要改变的就是尾节点指针;
(2)尾部去除,如果链表长度不为空,只需要改变倒数第二个节点的指针。 class LList1(LList):
def __init__(self):
LList.__init__(self)
self._rear = None
...
def prepend(self, elem):
if self._head is None:
self._head = LNode(elem)
self._rear = self._head
else:
self._head = LNode(elem, self._head)
def append(self, elem):
if self._head is None:
self._head = LNode(elem)
self._rear = self._head
else:
self._rear.next = LNode(elem)
self._rear = self._rear.next
def pop_last(self):
if self._head is None:
raise LinkedListUnderflow('in pop_last')
p = self._head
if p.next is None:
e = p.elem
self._head = None
return e
while p.next.next is not None:
p = p.next
e = p.next.elem
self._rear = p
p.next = None
return e
class LCList:
def __init__(self):
self._rear = None
def prepend(self, elem):
if self._rear is None:
self._rear = LNode(elem)
self._rear.next = self._rear
else:
self._rear.next = LNode(elem, self._rear.next)
def append(self, elem):
self.prepend(elem)
self_rear = self._rear.next
def pop(self):
if self._rear is None:
raise LinkedListUnderflow('in pop')
p = self._rear.next
if p is None:
self._rear = None
else:
self._rear.next = p.next
return p.elem
def printall(self):
if self._rear is None:
raise ...
p = self._rear.next
while True:
print(p.elem)
if p is self._rear:
break
p = p.next
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网