Go語言程式:在已排序的雙向連結串列中插入節點
雙向連結串列是一種資料結構,其中每個節點都包含對其前驅節點和後繼節點的引用。本程式旨在在插入新節點的同時保持連結串列的排序狀態。本文將學習如何建立一個 Go 語言程式,重點是如何在已排序的雙向連結串列中插入節點。我們將使用 `insertNode` 方法以及示例來詳細解釋這個概念。
語法
func insertNode(head *Node, value int) *Node
此語法表示一個名為“insertNode”的函式,它接收指向雙向連結串列頭節點的指標和一個整數值作為引數。它將插入一個包含給定值的新節點到連結串列中,並返回更新後的頭節點。
head.prev
head 代表連結串列的起始節點,prev 代表連結串列的最後一個節點。
current = next.prev
這用於透過移動到其前驅節點來更新當前節點。
current.value
這表示儲存在連結串列當前節點中的值。
演算法
建立一個包含需要插入的資料的新節點。
如果雙向連結串列為空,則將新節點設為連結串列的頭節點並返回。
從頭節點開始遍歷雙向連結串列,直到找到插入新節點的合適位置。
比較當前節點的資料與新節點的資料,以確定正確的位置。
找到正確的位置後,更新前驅節點和後繼節點的指標,以包含新節點。
調整新節點的指標,以將其連線到雙向連結串列中的前驅節點和後繼節點。
返回已插入新節點的更新後的雙向連結串列。
示例
在這個例子中,我們實現了一個名為 `insertNode` 的方法,用於在已排序的雙向連結串列中插入節點。該方法接收連結串列的頭節點和要插入的節點的值作為輸入引數。在主函式中,我們建立一個包含值 10、20 和 30 的示例雙向連結串列。我們列印原始連結串列,然後呼叫 `insertNode` 方法插入一個值為 25 的節點。最後,我們列印插入後的更新後的連結串列。這段程式碼演示瞭如何使用 `insertNode` 方法在已排序的雙向連結串列中插入節點,同時保持排序順序。
package main import "fmt" type Node struct { value int prev, next *Node } func insertNode(head *Node, value int) *Node { newNode := &Node{value: value} if head == nil { return newNode } if value < head.value { newNode.next = head head.prev = newNode return newNode } current := head for current.next != nil && current.next.value < value { current = current.next } newNode.next = current.next if current.next != nil { current.next.prev = newNode } current.next = newNode newNode.prev = current return head } func printList(head *Node) { current := head for current != nil { fmt.Printf("%d ", current.value) current = current.next } fmt.Println() } func main() { head := &Node{value: 10} node1 := &Node{value: 20} node2 := &Node{value: 30} head.next = node1 node1.prev = head node1.next = node2 node2.prev = node1 fmt.Println("Original List:") printList(head) head = insertNode(head, 25) fmt.Println("Updated List:") printList(head) }
輸出
Original List: 10 20 30 Updated List: 10 20 25 30
結論
總之,我們討論了在已排序的雙向連結串列中插入節點的 Go 語言程式,允許使用者在插入新節點的同時保持連結串列的排序狀態。透過遍歷連結串列和修改指標,程式確保新節點被插入到正確的位置。此演算法提供了一種高效的方式來管理 Go 語言中的已排序雙向連結串列。