成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

用golang實(shí)現(xiàn)的單向鏈表-創(chuàng)新互聯(lián)

復(fù)習(xí)一下數(shù)據(jù)結(jié)構(gòu),用golang來實(shí)現(xiàn)單向鏈表

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、成都微信小程序、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了南丹免費(fèi)建站歡迎大家使用!
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
}

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

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

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

// 向第i個(gè)節(jié)點(diǎn)處插入節(jié)點(diǎn)
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 // 新節(jié)點(diǎn)指向舊節(jié)點(diǎn)原來所指的next
        (*preNode).next = node         // 原節(jié)點(diǎn)的next指向新節(jié)點(diǎn)
    }
    (*list).size++

    return true
}

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

    if i == 0 {
        preHead := (*list).head     // 取出舊的鏈表頭
        (*list).head = preHead.next // 舊鏈表頭的next變?yōu)樾碌念^

        // 如果僅有一個(gè)節(jié)點(diǎn),則頭尾節(jié)點(diǎn)清空
        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     // 找到當(dāng)前要?jiǎng)h除的節(jié)點(diǎn)
        (*preNode).next = node.next // 把當(dāng)前要?jiǎng)h除節(jié)點(diǎn)的next賦給其父節(jié)點(diǎn)的next,完成后代轉(zhuǎn)移

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

    (*list).size--

    return true
}

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

// 獲取指定位置的節(jié)點(diǎn)
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
}

// 搜索某個(gè)數(shù)據(jù)的節(jié)點(diǎn)位置
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))
    }
}

創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開啟,新人活動(dòng)云服務(wù)器買多久送多久。

文章題目:用golang實(shí)現(xiàn)的單向鏈表-創(chuàng)新互聯(lián)
URL鏈接:http://jinyejixie.com/article12/dephdc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)網(wǎng)站營銷、網(wǎng)站維護(hù)、面包屑導(dǎo)航企業(yè)建站、網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作
平利县| 武平县| 夏河县| 西宁市| 青龙| 昂仁县| 丽江市| 仪陇县| 绩溪县| 奇台县| 韶关市| 双江| 太白县| 景泰县| 凤山县| 东港市| 池州市| 策勒县| 东港市| 南安市| 揭东县| 雅安市| 紫阳县| 保山市| 文成县| 鸡东县| 卢湾区| 大连市| 唐山市| 崇文区| 治多县| 禄丰县| 琼结县| 泰安市| 安达市| 东乡族自治县| 波密县| 信阳市| 保德县| 昌都县| 绩溪县|