1. 程式人生 > 其它 >資料結構--單向連結串列

資料結構--單向連結串列

單向連結串列的一種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)
}