資料結構--單向連結串列
阿新 • • 發佈:2021-07-02
單向連結串列的一種Go語言實現
package main import \"fmt\" type Node struct { no int name string next *Node } //實現尾部插入一個節點到連結串列(佇列Push的一種實現) func InsertTail(head *Node, newNode *Node){ //先找到連結串列的最後一個節點,需要保持頭結點不動,這裡建立一箇中間臨時節點 temp := head //遍歷連結串列直到最後一個節點進行插入 for { if temp.next == nil { //這個條件就是連結串列的最後位置 break } temp = temp.next } //將新的節點接入到連結串列尾部 temp.next = newNode } //實現有序插入一個節點到連結串列中 func InsertSort(head, newNode *Node){ temp := head //重點:插入時必須要在temp的位置讓temp.next.no和newNode.no進行比較,不然會錯過插入時機 for { if temp.next == nil { //說明已經在連結串列的尾部了 //注意:下面兩行的順序不能顛倒 newNode.next = temp.next temp.next = newNode break } else if temp.next.no >= newNode.no { newNode.next = temp.next temp.next = newNode break } temp = temp.next } } //實現頭部插入節點(佇列Push的一種實現) func InsertHead(head, newNode *Node){ newNode.next = head.next head.next = newNode } //實現一個刪除連結串列節點的函式 func Delete(head *Node, node *Node) { temp := head for { if temp.next == nil { //說明已經在連結串列的尾部了,沒有找到要刪除的節點 break } else if temp.next.no == node.no { temp.next = node.next //下面這種方法也可以,不過理解起來有點繞 //temp.next = temp.next.next break } temp = temp.next } } //實現一個頭部刪除連結串列節點的函式(佇列Pop的一種實現) func DeleteHead(head *Node){ if head.next == nil{ return }else { head.next = head.next.next } } //實現一個尾部刪除連結串列節點的函式(佇列Pop的一種實現) func DeleteTail(head *Node){ temp := head for { if temp.next == nil{ //說明連結串列為空 return }else if temp.next.next == nil{ temp.next = nil break } temp = temp.next } } //實現顯示連結串列中所有節點資訊 func List(head *Node){ //前提是不能改變頭結點 temp := head if temp.next == nil { fmt.Println(\"連結串列為空\") return } for { fmt.Printf(\"%d %s -->\", temp.next.no, temp.next.name) //列印下一個節點的資訊 temp = temp.next if temp.next == nil { break } } } func main(){ //定義一個頭結點 head := &Node{} //定義一個節點資訊 node1 := &Node{ no: 1, name: \"Number1\", next: nil, } node2 := &Node{ no: 2, name: \"Number2\", next: nil, } node3 := &Node{ no: 3, name: \"Number3\", next: nil, } node4 := &Node{ no: 2, name: \"Number4\", next: nil, } InsertTail(head, node1) InsertTail(head, node2) InsertSort(head, node3) InsertSort(head, node2) InsertSort(head, node1) InsertSort(head, node4) Delete(head, node4) InsertHead(head, node1) InsertHead(head, node2) InsertHead(head, node3) InsertHead(head, node4) DeleteHead(head) DeleteTail(head) List(head) }