Go語言程式連線兩個連結串列
在 Go 中,連結串列是一種線性資料結構,包含一個節點,該節點進一步包含兩個欄位,一個是資料,另一個是 next。next 包含後續節點的地址。我們將藉助兩種方法執行此程式。在第一種方法中,連結串列將被用作一系列節點,在第二個示例中,使用不同的變數來執行程式。
方法 1 - 使用連結串列作為一系列節點
此程式將連結串列描述為節點的集合,每個節點都具有一個 Value 和指向列表中下一個節點的指標。joinLists 函式需要兩個連結串列作為引數,並返回一個指向新列表頭的指標,該新列表是透過將第二個列表新增到第一個列表的末尾建立的。為了演示目的,printList 函式用於顯示列表的內容。
演算法
步驟 1 - 建立一個 package main 並宣告程式中的 fmt(格式化包)包,其中 main 生成可執行程式碼,fmt 幫助格式化輸入和輸出。
步驟 2 - 建立一個型別為 node 的結構體,其值為 int 型別,next 指標為 node 型別。
步驟 3 - 在下一步中,建立一個 main 函式,並在該函式中建立兩個要連線的連結串列。
步驟 4 - 從 main 中呼叫 joinLists 函式,並將兩個列表作為輸入。
步驟 5 - 檢視是否有任何一個連結串列為空;如果是,則返回非空連結串列。
步驟 6 - 建立一個指標,初始化為指向第一個連結串列 l1 的頂部。
步驟 7 - 使用當前指標遍歷第一個連結串列,直到到達 current。
步驟 8 - 接下來是 nil,表示列表已結束。接下來是第二個連結串列 l2 的頭部。接下來,返回第一個連結串列的 l1 頭部。
步驟 9 - 然後,可以使用 Next 指標從頭節點到尾節點遍歷連線的連結串列。
步驟 10 - 使用 printList 函式打印合並的連結串列,該語句使用 fmt.Println() 函式執行,其中 ln 表示換行。
示例
在此示例中,我們將使用連結串列作為一系列節點。
package main import "fmt" type Node struct { Value int Next *Node } func main() { list1 := &Node{Value: 10, Next: &Node{Value: 20, Next: &Node{Value: 30}}} list2 := &Node{Value: 40, Next: &Node{Value: 50, Next: &Node{Value: 60}}} joinedList := joinLists(list1, list2) fmt.Println("The two lists are merged as follows:") printList(joinedList) //print the merged list } func joinLists(li1, li2 *Node) *Node { if li1 == nil { return li2 } else if li2 == nil { //check if the list1 is null return list2 and vice-versa return li1 } current := li1 for current.Next != nil { current = current.Next } current.Next = li2 return li1 } func printList(l *Node) { for l != nil { fmt.Printf("%d ", l.Value) l = l.Next } fmt.Println() }
輸出
The two lists are merged as follows: 10 20 30 40 50 60
方法 2:在連結串列中使用不同型別的變數及其型別
此方法採用與上一個示例相同的基本方法,但在變數名稱和型別方面有一些變化。joinLists 函式需要兩個連結串列作為引數,並返回一個指向新列表頭的指標,該新列表是透過將第二個列表新增到第一個列表的末尾建立的。為了演示目的,printList 函式用於顯示列表的內容。
演算法
步驟 1 - 建立一個 package main 並宣告程式中的 fmt(格式化包)包,其中 main 生成可執行程式碼,fmt 幫助格式化輸入和輸出。
步驟 2 - 建立一個型別為 node 的結構體,其值為 int 型別,next 指標為 node 型別。
步驟 3 - 在下一步中,建立一個 main 函式,並在該函式中建立兩個要連線的連結串列。
步驟 4 - 呼叫 joinLists 函式並確定哪個連結串列為空,如果其中任何一個為空,則返回非空連結串列。
步驟 5 - 建立一個指標,其頭部初始化為第一個連結串列 li1。
步驟 6 - 將指標 li1 指向第一個連結串列的頭部。
步驟 7 - 直到 li1,使用 li1 指標遍歷第一個連結串列。
步驟 8 - 接下來是 null,表示列表的末尾已到達。
步驟 9 - 將 li1.next 設定為 li2。
步驟 10 - 然後,返回最頂層的連結串列頭部。
步驟 11 - 然後,透過跟隨 Next 指標,可以從頭節點到尾節點遍歷連線的連結串列。
示例
在此示例中,我們將使用不同的變數和型別來繼續執行。
package main import "fmt" type ListNode struct { Val int Next *ListNode } func main() { list1 := &ListNode{Val: 10, Next: &ListNode{Val: 20, Next: &ListNode{Val: 30}}} list2 := &ListNode{Val: 40, Next: &ListNode{Val: 50, Next: &ListNode{Val: 60}}} joinedList := joinLists(list1, list2) fmt.Println("The two linked lists are joined as follows:") printList(joinedList) //print the lists merged } func joinLists(li1, li2 *ListNode) *ListNode { if li1 == nil { return li2 } else if li2 == nil { //check if the list1 is null return list2 and vice-verca return li1 } head := li1 for li1.Next != nil { li1 = li1.Next } li1.Next = li2 return head } func printList(l *ListNode) { for l != nil { fmt.Printf("%d ", l.Val) l = l.Next } fmt.Println() }
輸出
The two linked lists are joined as follows: 10 20 30 40 50 60
結論
我們使用兩個示例執行了連線兩個連結串列的程式。在第一個示例中,我們將連結串列用作一系列節點,在第二個示例中,我們執行了類似的操作,但使用了不同的變數和型別。