一:連結串列
1、陣列是連續的記憶體空間;而連結串列可以不一定是連續的記憶體空間
2、單端連結串列;從前一個元素指向後一個元素
3、連結串列的功能
(1)訪問 o(n):陣列是透過下表或者索引訪問元素;連結串列是透過next指標以此遞迴的進行查詢判斷
(2)搜尋 o(n):從頭部遍歷;知道找到位置
(3)插入 o(1):
(4)刪除 o(1):
4、特點
寫入非常的快;但是讀非常的慢{value,next}
5、連結串列的常用操作
class ListNode:
def __init__(self, value=0, next=None):
self.value = value
self.next = next#next為指向下一個節點的指標;next=None表示連結串列為空
class LinkedList:
def __init__(self):
self.head = None#指向連結串列的第一個節點
# 插入節點到連結串列的頭部
def insert_at_head(self, value):
new_node = ListNode(value)#建立一個新節點;值=value
new_node.next = self.head#將新節點的next指標指向當前的頭節點
self.head = new_node#更新連結串列的頭節點
# 插入節點到連結串列的尾部
def insert_at_tail(self, value):
new_node = ListNode(value)#建立一個新的節點
if not self.head:#如果沒有頭節點
self.head = new_node#新建立的節點作為頭節點
else:
current = self.head#否則遍歷連結串列;找到最後一個節點;將新的節點插入到最後的節點當中
while current.next:
current = current.next
current.next = new_node
# 刪除連結串列中第一個匹配的節點
def delete_node(self, value):
current = self.head
if not current:
return
# 如果要刪除的節點是頭節點
if current.value == value:
self.head = current.next
return
# 找到要刪除的節點並移除它
while current.next:
if current.next.value == value:
current.next = current.next.next
return
current = current.next
# 列印連結串列
def print_list(self):
current = self.head
while current:
print(current.value, end=" -> ")
current = current.next
print("None")
二:刷題
題目203 移除連結串列元素
(1)思路:首先定義一個虛擬的節點dummy;這個虛擬的節點的目的就是為了防止頭節點移動的時候元素丟失;然後在定義一個虛擬的節點current;這個節點的目的就是為了記錄head節點移動前的位置;也是為了遍歷連結串列;整體思路就是:如果當前連結串列的元素等於val;那麼就跳過當前的節點繼續遍歷;如果當前的節點不等於目標值的話,那麼就正常的進行遍歷!
#初始化連結串列
class ListNode:
def __init__(self,val=0,next=None):
self.val=val
self.next=next
class Solution:
def removeElements(self, head: ListNode, val: int) -> ListNode:
dummy=ListNode(0)
dummy.next=head
current=dummy
while current.next:
if current.next.val==val:
current.next=current.next.next
else:
current=current.next
return dummy.next
題目206 反轉連結串列
from typing import Optional
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution:
def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
# 整合你想使用的函式,這次實現反轉連結串列
def func(head):
if head is None:
print(head, end="")
return None
prev = None
current = head
while current is not None:
next_node = current.next
current.next = prev
prev = current
current = next_node
return prev
return func(head)
# 輔助函式:將列表轉換為連結串列
def list_to_linkedlist(lst):
if not lst:
return None
head = ListNode(lst[0])
current = head
for item in lst[1:]:
current.next = ListNode(item)
current = current.next
return head
# 輔助函式:將連結串列轉換為列表
def linkedlist_to_list(node):
result = []
while node:
result.append(node.val)
node = node.next
return result
# 示例測試
head_list = [] # 空列表表示空連結串列
head = list_to_linkedlist(head_list)
solution = Solution()
reversed_head = solution.reverseList(head)
print(linkedlist_to_list(reversed_head)) # 輸出: []