引子
數據結構指的是是數據的組織的方式。從單個數據到一維結構(線性表),二維結構(樹),三維結構(圖),都是組織數據的不同方式。
為什么需要鏈表?
順序表的構建需要預先知道數據大小來申請連續的存儲空間,而在進行擴充時又需要進行數據的搬遷,所以使用起來並不是很靈活。
鏈表結構可以充分利用計算機內存空間,實現靈活的內存動態管理。
鏈表(Linked list)是一種常見的基礎數據結構,是一種線性表,但是不像順序表一樣連續存儲數據,而是在每一個節點(數據存儲單元)里存放下一個節點的位置信息(即地址)。
什么是單鏈表?
單向鏈表也叫單鏈表,是鏈表中最簡單的一種形式,它的每個節點包含兩個域,一個信息域(元素域)和一個鏈接域。這個鏈接指向鏈表中的下一個節點,而最后一個節點的鏈接域則指向一個空值。
單鏈表應當支持哪些基本操作?
- is_empty() 鏈表是否為空
- length() 鏈表長度
- travel() 遍歷整個鏈表
- add(item) 鏈表頭部添加元素
- append(item) 鏈表尾部添加元素
- insert(pos, item) 指定位置添加元素
- remove(item) 刪除節點
- search(item) 查找節點是否存在
操作圖解:
add
insert
remove
代碼實現
注意點:
因為沒有計數,因此諸多操作都離不開遍歷,何時停止不可迷糊。另外,不要忘記經常要考慮的特殊情況。如果為空會如何?如果鏈表中只有一個節點會如何?構造新鏈時,該遵循怎樣的順序?(先保證原鏈不斷)
class Node(object): def __init__(self, value): # 元素域 self.value = value # 鏈接域 self.next = None class LinkedListOneway(object): def __init__(self, node=None): self.__head = node def __len__(self): # 游標,用來遍歷鏈表 cur = self.__head # 記錄遍歷次數 count = 0 # 當前節點為None則說明已經遍歷完畢 while cur: count += 1 cur = cur.next return count def is_empty(self): # 頭節點不為None則不為空 return self.__head == None def add(self, value): """ 頭插法 先讓新節點的next指向頭節點 再將頭節點替換為新節點 順序不可錯,要先保證原鏈表的鏈不斷,否則頭節點后面的鏈會丟失 """ node = Node(value) node.next = self.__head self.__head = node def append(self, value): """尾插法""" node = Node(value) cur = self.__head if self.is_empty(): self.__head = node else: while cur.next: cur = cur.next cur.next = node def insert(self, pos, value): # 應對特殊情況 if pos <= 0: self.add(value) elif pos > len(self) - 1: self.append(value) else: node = Node(value) prior = self.__head count = 0 # 在插入位置的前一個節點停下 while count < (pos - 1): prior = prior.next count += 1 # 先將插入節點與節點后的節點連接,防止鏈表斷掉,先鏈接后面的,再鏈接前面的 node.next = prior.next prior.next = node def remove(self, value): cur = self.__head prior = None while cur: if value == cur.value: # 判斷此節點是否是頭節點 if cur == self.__head: self.__head = cur.next else: prior.next = cur.next break # 還沒找到節點,有繼續遍歷 else: prior = cur cur = cur.next def search(self, value): cur = self.__head while cur: if value == cur.value: return True cur = cur.next return False def traverse(self): cur = self.__head while cur: print(cur.value) cur = cur.next