最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python數(shù)據(jù)結構與算法之鏈表定義與用法實例詳解【單鏈表、循環(huán)鏈表】

 更新時間:2017年09月28日 11:04:14   作者:Inside_Zhang  
這篇文章主要介紹了Python數(shù)據(jù)結構與算法之鏈表定義與用法,結合具體實例形式較為詳細的分析了單鏈表、循環(huán)鏈表等的定義、使用方法與相關注意事項,需要的朋友可以參考下

本文實例講述了Python數(shù)據(jù)結構與算法之鏈表定義與用法。分享給大家供大家參考,具體如下:

本文將為大家講解:

(1)從鏈表節(jié)點的定義開始,以類的方式,面向?qū)ο蟮乃枷脒M行鏈表的設計

(2)鏈表類插入和刪除等成員函數(shù)實現(xiàn)時需要考慮的邊界條件,
prepend(頭部插入)、pop(頭部刪除)、append(尾部插入)、pop_last(尾部刪除)

2.1 插入:

空鏈表
鏈表長度為1
插入到末尾

2.2 刪除

空鏈表
鏈表長度為1
刪除末尾元素

(3)從單鏈表到單鏈表的一眾變體:

帶尾節(jié)點的單鏈表
循環(huán)單鏈表
雙鏈表

1. 鏈表節(jié)點的定義

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

2. 單鏈表的實現(xiàn)

重點理解插入、刪除的實現(xiàn)及其需要考慮的邊界條件:

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)尾部插入,如果鏈表不為空,需且僅需改變的是尾部節(jié)點的指針;
(2)尾部刪除,如果鏈表長度不為空,需且僅需改變的是倒數(shù)第二個節(jié)點的指針。

單鏈表的簡單變形:具有尾部節(jié)點的單鏈表

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

單鏈表的變體:循環(huán)單鏈表

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

更多關于Python相關內(nèi)容可查看本站專題:《Python數(shù)據(jù)結構與算法教程》、《Python Socket編程技巧總結》、《Python函數(shù)使用技巧總結》、《Python字符串操作技巧匯總》、《Python入門與進階經(jīng)典教程》及《Python文件與目錄操作技巧匯總

希望本文所述對大家Python程序設計有所幫助。

相關文章

最新評論

红安县| 胶南市| 滦南县| 哈巴河县| 丽江市| 剑川县| 宁夏| 永新县| 朝阳市| 武威市| 永靖县| 金山区| 云阳县| 宽甸| 和林格尔县| 怀安县| 淮滨县| 宾阳县| 泾源县| 无锡市| 永嘉县| 福安市| 神农架林区| 青冈县| 阿尔山市| 重庆市| 万宁市| 洪江市| 乐清市| 色达县| 郓城县| 张北县| 温宿县| 博罗县| 大庆市| 葵青区| 旬阳县| 灌阳县| 巴林右旗| 永靖县| 武平县|