中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

用golang實現的單向鏈表

發布時間:2020-05-16 23:47:13 來源:網絡 閱讀:409 作者:ustb80 欄目:編程語言

復習一下數據結構,用golang來實現單向鏈表

package main

import "fmt"

type Object interface{}

type Node struct {
    Data Object
    next *Node
}

type List struct {
    size uint64
    head *Node
    tail *Node
}

func (list *List) Init() {
    (*list).size = 0
    (*list).head = nil
    (*list).tail = nil
}

// 向鏈表追加節點
func (list *List) Append(node *Node) bool {
    if node == nil {
        return false
    }

    (*node).next = nil // 新加節點在末尾,沒有next
    if (*list).size == 0 {
        (*list).head = node
    } else {
        oldTail := (*list).tail // 取尾結點
        (*oldTail).next = node  // 尾結點的next指向新加節點
    }

    (*list).tail = node // 新節點是尾結點
    (*list).size++
    return true
}

// 向第i個節點處插入節點
func (list *List) Insert(i uint64, node *Node) bool {
    if node == nil || i > (*list).size || (*list).size == 0 {
        return false
    }

    if i == 0 {
        (*node).next = (*list).head
        (*list).head = node
    } else {
        preNode := (*list).head
        for j := uint64(1); j < i; j++ {
            preNode = (*preNode).next
        }

        (*node).next = (*preNode).next // 新節點指向舊節點原來所指的next
        (*preNode).next = node         // 原節點的next指向新節點
    }
    (*list).size++

    return true
}

// 移除指定位置的節點
func (list *List) Remove(i uint64) bool {
    if i >= (*list).size {
        return false
    }

    if i == 0 {
        preHead := (*list).head     // 取出舊的鏈表頭
        (*list).head = preHead.next // 舊鏈表頭的next變為新的頭

        // 如果僅有一個節點,則頭尾節點清空
        if (*list).size == 1 {
            (*list).head = nil
            (*list).tail = nil
        }
    } else {
        preNode := (*list).head
        for j := uint64(1); j < i; j++ {
            preNode = (*preNode).next
        }

        node := (*preNode).next     // 找到當前要刪除的節點
        (*preNode).next = node.next // 把當前要刪除節點的next賦給其父節點的next,完成后代轉移

        // 若刪除的尾部,尾部指針需要調整
        if i == ((*list).size - 1) {
            (*list).tail = preNode
        }
    }

    (*list).size--

    return true
}

// 移除所有節點
func (list *List) RemoveAll() bool {
    (*list).Init()
    return true
}

// 獲取指定位置的節點
func (list *List) Get(i uint64) *Node {
    if i >= (*list).size {
        return nil
    }

    node := (*list).head
    for j := uint64(0); j < i; j++ {
        node = (*node).next
    }

    return node
}

// 搜索某個數據的節點位置
func (list *List) IndexOf(data Object) int64 {
    pos := int64(-1)
    node := (*list).head
    if node.Data == data {
        return 0
    }

    for j := uint64(1); j < (*list).size; j++ {
        if node != nil {
            node = (*node).next
            if node != nil && node.Data == data {
                pos = int64(j)
                break
            }
        }
    }
    return pos
}

// 取得鏈表長度
func (list *List) GetSize() uint64 {
    return (*list).size
}

// 取得鏈表頭
func (list *List) GetHead() *Node {
    return (*list).head
}

// 取得鏈表尾
func (list *List) GetTail() *Node {
    return (*list).tail
}

func main() {
    var l List
    l.Init()

    node1 := &Node{Data: 11111}
    l.Append(node1)

    node2 := &Node{Data: 22222}
    l.Append(node2)

    node3 := &Node{Data: 33333}
    l.Append(node3)

    node4 := &Node{Data: "insert"}
    l.Insert(1, node4)

    node5 := &Node{Data: "head"}
    l.Insert(0, node5)

    node6 := &Node{Data: "tail"}
    l.Append(node6)

    l.Remove(0)
    l.Remove(1)
    l.Remove(3)

    pos1 := l.IndexOf(22222)
    pos2 := l.IndexOf(44444)
    fmt.Println(pos1, pos2)

    fmt.Println(l.GetHead(), l.GetTail(), l.GetSize())
    fmt.Println()

    //l.RemoveAll()

    for i := uint64(0); i < l.size; i++ {
        fmt.Println(l.Get(i))
    }
}
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

西安市| 安乡县| 新安县| 永嘉县| 建平县| 宁明县| 那曲县| 汉寿县| 泗阳县| 长岛县| 邹平县| 襄垣县| 聂拉木县| 论坛| 陇南市| 宁化县| 开平市| 崇阳县| 盐山县| 璧山县| 田阳县| 安阳县| 商南县| 龙岩市| 临夏县| 金湖县| 吉水县| 六盘水市| 安陆市| 西乡县| 屏东县| 尤溪县| 淳安县| 黄陵县| 施秉县| 阿坝| 嘉峪关市| 彰化市| 松潘县| 集安市| 九寨沟县|