Python数据结构与算法(五)--链表
生活随笔
收集整理的這篇文章主要介紹了
Python数据结构与算法(五)--链表
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
鏈表
鏈表的定義:
鏈表(Linked list)是一種常見的基礎數據結構,是一種線性表,但是不像順序表一樣連續存儲數據,而是在每一個節點(數據存儲單元)里存放下一個節點的位置信息(即地址)。
單項鏈表
單向鏈表也叫單鏈表,是鏈表中最簡單的一種形式,它的每個節點包含兩個域,一個信息域(元素域)和一個鏈接域。這個鏈接指向鏈表中的下一個節點,而最后一個節點的鏈接域則指向一個空值。
- 表元素域elem用來存放具體的數據。
- 鏈接域next用來存放下一個節點的位置(python中的標識)
- 變量p指向鏈表的頭節點(首節點)的位置,從p出發能找到表中的任意節點。
單向循環鏈表
單鏈表的一個變形是單向循環鏈表,鏈表中最后一個節點的next域不再為None,而是指向鏈表的頭節點。
''' 單循環鏈表 ''' class Node(object):'''單向鏈表的節點'''def __init__(self, item):self.elem = itemself.next = Noneclass SingleCircleLinkList(object):'''單循環鏈表'''def __init__(self, node = None):self.__head = nodeif node:node.next = nodedef is_empty(self):'''鏈表是否為空'''return self.__head == Nonedef length(self):'''鏈表長度'''cur = self.__headcount = 1while cur.next != self.__head:count += 1cur = cur.nextreturn countdef travel(self):'''遍歷整個鏈表'''cur = self.__headif cur == None:returnelse:while cur.next != self.__head:print(cur.elem, end=" ")cur = cur.nextprint(cur.elem)def add(self, item):'''鏈表頭部添加元素'''cur = self.__headnode = Node(item)if cur == None:self.__head = nodenode.next = nodeelse:while cur.next != self.__head:cur = cur.nextnode.next = cur.nextself.__head = nodecur.next = nodedef append(self, item):'''鏈表尾部添加元素'''cur = self.__headnode = Node(item)if cur == None:self.__head = nodenode.next = nodeelse:while cur.next != self.__head:cur = cur.nextcur.next = nodenode.next = self.__headdef insert(self, pos, item):'''指定位置添加元素'''if pos <= 0:self.add(item)elif pos > (self.length() - 1):self.append(item)else:count = 0cur = self.__headpre = Nonenode = Node(item)while count < pos:count += 1pre = curcur = cur.nextnode.next = curpre.next = nodedef remove(self, item):'''刪除節點''''''注意1、為空2、第一個節點的情況a) 列表只有一個節點b) 列表有多個節點3、在中間的情況'''if self.is_empty():return Nonecur = self.__headpre = Nonewhile cur.next != self.__head:if cur.elem == item:if cur == self.__head:rear = self.__headwhile rear.next != self.__head:rear = rear.nextself.__head = cur.nextrear.next = self.__headelse:pre.next = cur.nextreturnelse:pre = curcur = cur.next# 鏈表的最后一個元素if cur.elem == item:if pre == None:self.__head = Noneelse:pre.next = self.__headdef search(self, item):'''查找節點是否存在'''cur = self.__headif cur == None:return Falsewhile cur.next != self.__head:if cur.elem == item:return Truecur = cur.nextif cur.elem == item:return Truereturn Falsen = Node("1") sc = SingleCircleLinkList()sc.add("a") sc.add("b") sc.add("c") sc.add("d") sc.add("e") sc.add("f") sc.append("11") sc.insert(2, '22')sc.travel()sc.remove('f') sc.travel()雙向鏈表
一種更復雜的鏈表是“雙向鏈表”或“雙面鏈表”。每個節點有兩個鏈接:一個指向前一個節點,當此節點為第一個節點時,指向空值;而另一個指向下一個節點,當此節點為最后一個節點時,指向空值。
''' 雙向鏈表 '''class Node(object):'''節點'''def __init__(self, item):self.elem = itemself.prev = Noneself.next = Noneclass DoubleLinkList(object):'''雙向鏈表'''def __init__(self, node = None):self.__head = nodedef is_empty(self):'''鏈表是否為空'''return self.__head == Nonedef length(self):'''鏈表長度'''cur = self.__headcount = 0while cur != None:cur = cur.nextcount += 1return countdef travel(self):'''遍歷整個鏈表'''cur = self.__headwhile cur != None:print(cur.elem, end=" ")cur = cur.nextprint("")def add(self, item):'''鏈表頭部添加元素'''node = Node(item)if self.__head == None:self.__head = nodeelse:node.next = self.__headself.__head.prev = nodeself.__head = nodedef append(self, item):'''鏈表尾部添加元素'''node = Node(item)cur = self.__headif cur == None:self.__head = nodeelse:while cur.next != None:cur = cur.nextcur.next = nodenode.prev = curdef insert(self, pos, item):'''指定位置添加元素'''if pos <= 0:self.add(item)elif pos > (self.length() - 1):self.append(item)else:node = Node(item)cur = self.__headcount = 0while count < pos:count += 1cur = cur.nextnode.next = curnode.prev = cur.prevcur.prev = nodenode.prev.next = nodedef remove(self, item):'''刪除節點'''cur = self.__headwhile cur != None:if cur.elem == item:if cur == self.__head:'''刪除第一個元素'''self.__head = cur.nextif cur.next:cur.next.prev = Noneelse:cur.prev.next = cur.nextif cur.next:cur.next.prev = cur.prevreturnelse:cur = cur.nextdef search(self, item):'''查找節點是否存在'''cur = self.__headwhile cur != None:if cur.elem == item:return Truecur = cur.nextreturn Falsedl = DoubleLinkList()print("is_empty = ", dl.is_empty()) print("length = ", dl.length()) dl.add("aa") dl.add("bb") dl.add("cc") dl.append("dd") dl.append("ee")dl.travel()# dl.remove("cc") dl.remove("bb") dl.remove('ee') dl.travel()# print(dl.search("1"))dl.insert(0, "00") dl.insert(2, '22')dl.travel()?
總結
以上是生活随笔為你收集整理的Python数据结构与算法(五)--链表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【NLP】完全解析!Bert Tran
- 下一篇: 我的《机器学习》课程的课件合集下载