資料結構—連結串列

Gsupl.落浅~發表於2024-09-13

一:連結串列

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))  # 輸出: []

相關文章