Go 語言程式:從連結串列中刪除元素


在 Go 中,連結串列是一種線性資料結構,其元素透過指標連線,從第一個節點(頭節點)到最後一個節點(尾節點),可以依次訪問每個節點。我們將透過兩個示例來演示從連結串列中刪除元素的程式。第一個示例使用節點結構體,第二個示例使用啞節點。

方法 1:使用節點結構體

此程式碼建立了一個 Node 結構體,它有兩個欄位:Value 和 Next,後者連結到列表中的下一個節點。remove_node 方法從列表中刪除具有指定值的節點,並返回列表的新頭節點。它接受列表的頭節點和要刪除的值作為引數。

演算法

  • 步驟 1 − 建立一個名為 main 的包,並在程式中宣告 fmt(格式化包)。main 包生成可執行程式碼,fmt 包幫助格式化輸入和輸出。

  • 步驟 2 − 建立一個節點結構體,其中 value 欄位型別為 int,next 欄位型別為 node。

  • 步驟 3 − 建立一個名為 remove_node 的函式,並在該函式中檢查頭節點是否為空。如果是,則返回 nil。

  • 步驟 4 − 檢查頭節點的值是否與要刪除的值匹配。如果是,則返回列表中的下一個節點。

  • 步驟 5 − 在下一步中,將頭節點設定為當前節點的指標。

  • 步驟 6 − 然後,遍歷列表,直到下一個節點不為空。

  • 步驟 7 − 更新當前節點的 next 指標以跳過下一個節點,如果下一個節點的值等於要刪除的值,則結束迴圈。

  • 步驟 8 − 將下一個節點設定為當前節點的指標。

  • 步驟 9 − 將頭節點返回到下一個函式。

  • 步驟 10 − 在 main 函式中,列印從連結串列中刪除元素後的當前值。

示例

在此示例中,我們將使用節點結構體從連結串列中刪除元素。

package main
import "fmt"

type Node struct {
   Value int
   Next  *Node
}

func remove_node(head *Node, value int) *Node {
   if head == nil {
      return nil
   }

   if head.Value == value {
      return head.Next
   }

   current := head //remove the elements from the list
   for current.Next != nil {
      if current.Next.Value == value {
         current.Next = current.Next.Next
         break
      }
      current = current.Next
   }
   
   return head
}

func main() {
   head := &Node{Value: 1, Next: &Node{Value: 2, Next: &Node{Value: 3, Next: nil}}}
   fmt.Println("The linked list after removal of element is:")
   head = remove_node(head, 2)
   for current := head; current != nil; current = current.Next {
      fmt.Println(current.Value) //print the modified linked list
   }
}

輸出

The linked list after removal of element is:
1
3

方法 2:使用啞節點

此方法使用啞節點來簡化邊界情況。remove_node 函式透過接受列表的頭節點和要刪除的值作為引數,並返回列表的新頭節點,來刪除具有指定值的節點。讓我們透過程式碼和演算法來理解這個概念。

演算法

  • 步驟 1 − 建立一個名為 main 的包,並在程式中宣告 fmt(格式化包)。main 包生成可執行程式碼,fmt 包幫助格式化輸入和輸出。

  • 步驟 2 − 建立一個 Node 結構體,其中 num_value 欄位型別為 int,Next 欄位型別為 Node。

  • 步驟 3 − 建立一個名為 remove_node 的函式,它有兩個輸入引數:head 和 value。然後,建立一個啞節點,並將它的 next 欄位設定為列表的頭節點。

  • 步驟 4 − 建立一個名為 prior 的節點指標,指向啞節點。

  • 步驟 5 − 在下一步中,遍歷列表,直到下一個節點不為空。

  • 步驟 6 − 更新前一個節點的 next 指標以跳過下一個節點,如果下一個節點的值與要刪除的值相同,則結束迴圈。

  • 步驟 7 − 然後,將前一個節點指標移動到下一個節點。

  • 步驟 8 − 刪除具有指定值的節點後,列表的頭節點作為啞節點的 next 欄位。

  • 步驟 9 − 將 dummy.next 返回到函式,並在 main 函式中使用 fmt.Println() 函式列印連結串列,其中 ln 表示換行。

示例

在此示例中,我們將使用啞節點從連結串列中刪除元素。

package main
import "fmt"

type Node struct {
   num_value int
   Next      *Node
}

func remove_node(head *Node, value int) *Node {
   dummy := &Node{Next: head} //remove the required element from the list
   prev := dummy
   for prev.Next != nil {
      if prev.Next.num_value == value {
         prev.Next = prev.Next.Next
         break
      }
      prev = prev.Next
   }
   return dummy.Next
}
func main() {
   fmt.Println("The linked list after removal of elements:")
   head := &Node{num_value: 1, Next: &Node{num_value: 2, Next: &Node{num_value: 3, Next: nil}}}
   head = remove_node(head, 2)
   for current := head; current != nil; current = current.Next {
      fmt.Println(current.num_value)   //print the modified list
   }
}

輸出

The linked list after removal of elements:
1
3

結論

我們使用兩個示例演示了從連結串列中刪除元素的程式。在第一個示例中,我們使用了節點結構體,在第二個示例中,我們使用了啞節點來執行程式。

更新於: 2023年2月20日

672 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.