Python - 鏈表的實現及排序


### 內存
- 計算機的作用
    - 存儲和運算二進制的數據。

內存

  • 計算機的作用

    • 存儲和運算二進制的數據。
  • 問題:計算機如何計算1+2?

    • 現將1和2(0010)進行存儲
    • 計算機會使用加法寄存器進行加法運算
  • 變量的概念

    • 引用==變量。變量就是我們為存儲數據單獨開辟的內存空間。
  • 形象化理解內存(內存的大小和地址)

    • 開辟好的內存空間會有兩個默認的屬性:大小,地址
    • 大小:衡量該塊內存能夠存儲數據的大小
      • bit(位):只可以存放一位二進制的數
      • byte(字節):8bit
      • kb:1024byte
      • 10Mb:1010241024*8
      • 作用:可以衡量該內存存儲數據大小的范圍
    • 地址:16進制的數表示
      • 作用:定位內存空間的位置
      • 變量/引用:內存空間的地址
  • 理解a=10的內存圖(指向)

    • 如果一個變量表示的是某一塊內存空間的地址,則該變量指向該塊內存空間。
      • 如果一個變量指向了某一塊內存空間,則該變量就可以代替/表示這塊內存中存儲的數值
  • 不同數據占用內存空間的大小

    • 整數:4字節
    • 浮點型:
      • float:4字節
      • double:8字節
      • 字符型(char):1字節
### 順序表
- 集合中存儲的元素是有順序的,順序表的結構可以分為兩種形式:單數據類型和多數據類型。
- python中的列表和元組就屬於多數據類型的順序表
![](1.png)
![](2.png)

順序表

  • 集合中存儲的元素是有順序的,順序表的結構可以分為兩種形式:單數據類型和多數據類型。

  • python中的列表和元組就屬於多數據類型的順序表

  • 單數據類型順序表的內存圖(內存連續開啟)

  • 多數據類型順序表的內存圖(內存非連續開辟)

  • 順序表的弊端:順序表的結構需要預先知道數據大小來申請連續的存儲空間,而在進行擴充時又需要進行數據的搬遷。

鏈表:相對於順序表,鏈表結構可以充分利用計算機內存空間,實現靈活的內存動態管理且進行擴充時不需要進行數據搬遷。

  • 鏈表(Linked list)是一種常見的基礎數據結構,是一種線性表,但是不像順序表一樣連續存儲數據,而是每一個結點(數據存儲單元)里存放下一個結點的信息(即地址)
. is_empty():鏈表是否為空

. length():鏈表長度

. travel():遍歷整個鏈表

. add(item):鏈表頭部添加元素

. append(item):鏈表尾部添加元素

. insert(pos, item):指定位置添加元素

. remove(item):刪除節點

. search(item):查找節點是否存在
class Node():
    def __init__(self,item):
        self.item = item #為了存儲數值數據
        self.next = None #為存儲下一個節點的地址
class Link():
    #構建一個空鏈表
    def __init__(self):
        #_head要指向第一個節點,如果沒有節點則指向None
        self._head = None
        
    def add(self,item):
        #1.創建一個新節點
        node = Node(item)
        node.next = self._head
        self._head = node
    def travel(self):
#         print(self._head.item)
#         print(self._head.next.item)
#         print(self._head.next.next.item)

        #在非空的鏈表中head永遠要指向第一個節點的地址,永遠不要修改它的指向,否則會造成數據的丟失
        cur = self._head
        while cur:
            print(cur.item)
            cur = cur.next
    
        
    def is_empty(self):
        return self._head == None
    def length(self):
        cur = self._head
        count = 0#記錄節點的個數
        while cur:
            count += 1
            cur = cur.next
        return count
    
    def append(self,item):
        node = Node(item)
        cur = self._head #當前節點
        pre = None #指向cur的前一個節點
        if self._head == None:#如果鏈表為空則需要單獨處理
            self._head = node
            return
        
        while cur:
            pre = cur
            cur = cur.next#循環結束之后cur指向了None,pre指向了最后一個節點
            
        pre.next = node
        
    def search(self,item):
        cur = self._head
        find = False
        while cur:
            if cur.item == item:
                find = True
                break
            else:
                cur = cur.next
        return find
    
    def insert(self,pos,item):
        node = Node(item)
        cur = self._head
        pre = None
        
        #如果插入的位置大於了鏈表的長度,則默認插入到尾部
        if pos > self.length()-1:
            self.append(item)
            return
        
        for i in range(pos):
            pre = cur
            cur = cur.next
        pre.next = node
        node.next = cur
        
    def remove(self,item):
        cur = self._head
        pre = None
        
        if item == cur.item:
            self._head = cur.next
            return
        
        while cur:
            if cur.item != item:
                pre = cur
                cur = cur.next
            else:
                break
        pre.next = cur.next
                
                 
link = Link()
link.append(1)
link.append(2)
link.append(3)
link.append(4)
link.append(5)
link.remove(4)
link.travel()


1
2
3
5


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM