Code前端首页关于Code前端联系我们

Python数据结构和算法单链表和循环链表的定义和使用示例

terry 2年前 (2023-09-27) 阅读数 64 #数据结构与算法

示例从Python数据结构和算法中描述了链表的定义和使用。

(1) 根据链表节点的定义,以面向类和面向对象的方式设计链表。

(2)实现链表类的插入、删除等成员函数时要考虑的前提条件,
prepend(头插入)、pop(头删除)、append(尾插入)、pop_last(去掉尾) )

2.1 插入:

空链表
链表长度为1
插入到末尾

2.2删除

2.2删除

空链表
链表长度列表为 1
删除最后一个元素

(3) 从单链表到单链表的多种变化:

带尾节点的单链表
循环单链表
双向链表

1。链表节点的定义

class LNode:
 def __init__(self, elem, next_=None):
  self.elem = elem
  self.next = next_

2。单链表的实现

重点了解插入和删除的实现以及需要考虑的前提条件:

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

简单总结:

(0) 访问p.next.next的条件是p。 next 不为空;
(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前端网发表,如需转载,请注明页面地址。

热门