Python編程題45--移除鏈表元素

題目

給定一個鏈表的頭節點 head 和一個整數 val ,請刪除鏈表中所有滿足 Node.val == val 的節點,並返回 新的頭節點 。

例如:

原鏈表轉換爲列表:[1, 2, 6, 3, 4, 5, 6],要刪除的鏈表元素 val = 6
最終的鏈表轉換爲列表:[1, 2, 3, 4, 5]

原鏈表轉換爲列表:[],要刪除的鏈表元素 val = 1
最終的鏈表轉換爲列表:[]

原鏈表轉換爲列表:[7, 7, 7, 7],要刪除的鏈表元素 val = 7
最終的鏈表轉換爲列表:[]

已知 鏈表節點的定義、鏈表與列表相互轉換 的代碼如下:

class ListNode:  # 單鏈表
    def __init__(self, val=0, next=None):
        self.val = val  # 鏈表節點上存儲的元素
        self.next = next  # 指向下一個鏈表節點


def list_to_list_node(numbers):  # 將列表轉換爲單向鏈表,並返回鏈表的頭節點
    dummy_head = ListNode(0)
    pre = dummy_head
    for number in numbers:
        pre.next = ListNode(number)
        pre = pre.next
    pre = dummy_head.next
    return pre


def list_node_to_list(node):  # 將單向鏈表轉換爲列表
    result = []
    while node:
        result.append(node.val)
        node = node.next
    return result

實現思路1

  • 設置一個虛擬頭節點 dummy_head ,然後再進行鏈表節點的刪除
  • 對鏈表節點進行遍歷,如果下一個節點符合條件,那麼就讓則讓下一個節點向後移動一位,也就是讓下一個節點的 next 指向下個節點的下個節點,同時注意此時不能讓當前節點 cur 向後移動,因爲 下個節點的下個節點 cur.next.next 很可能也符合條件,所以需繼續循環
  • 如果下一個節點不滿足條件時,那麼才讓當前節點向後移動一位
  • 最後返回頭節點時,需要注意新的頭節點是 dummy_head 的下一個節點,即 dummy_head.next

代碼實現1

def removeElements(head: ListNode, val: int) -> ListNode:
    dummy_head = ListNode(next=head)  # 設置一個虛擬頭節點
    cur = dummy_head
    while cur.next is not None:
        if cur.next.val == val:  # 如果滿足條件,則讓下一個節點指向下下個節點
            cur.next = cur.next.next
        else:
            cur = cur.next
    new_head = dummy_head.next  # 新的頭節點爲虛擬頭節點的下一個節點
    return new_head

實現思路2

  • 不設置虛擬頭節點,直接用原鏈表進行節點的刪除
  • 對於符合條件的節點,在刪除節點的時候,這裏需區分頭節點和非頭節點的情況,二者的處理方式不一樣
  • 首先需要處理符合條件的鏈表頭節點,如果鏈表頭節點符合條件,那麼直接讓頭節點向後移動一位,循環該操作,直到其不再滿足條件
  • 接着處理非頭節點的情況,如果下一個節點符合條件,那麼就讓則讓下一個節點向後移動一位,也就是讓下一個節點的 next 指向下個節點的下個節點,同時注意此時不能讓當前節點 cur 向後移動,因爲 下個節點的下個節點 cur.next.next 很可能也符合條件,所以需繼續循環
  • 最後在下一個節點不滿足條件時,那麼才讓當前節點向後移動一位

代碼實現2

def removeElements(head: ListNode, val: int) -> ListNode:
    while head is not None and head.val == val:  # 刪除符合條件的所有頭節點
        head = head.next
    cur = head
    while cur is not None and cur.next is not None:  # 刪除符合條件的所有其他節點
        if cur.next.val == val:  # 如果滿足條件,則讓下一個節點指向下下個節點
            cur.next = cur.next.next
        else:
            cur = cur.next
    return head

更多Python編程題,等你來挑戰:Python編程題彙總(持續更新中……)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章