鏈表

鏈表.jpg
鏈表-存儲原理.jpg
鏈表操作.jpg
鏈表操作1.jpg
鏈表操作2.jpg
鏈表優(yōu)缺點.jpg

代碼示例

package main

import (
    "errors"
    "fmt"
    "strconv"
)

// Node 節(jié)點
type Node struct {
    data int   // data 節(jié)點存儲數(shù)據(jù)
    next *Node // next node 下一個節(jié)點
}

// SingletonNode 單向鏈表
type SingleLinkedList struct {
    head *Node // head 頭節(jié)點
    size int   // size 鏈表數(shù)量
}

// New 創(chuàng)建單向鏈表
func New() *SingleLinkedList {
    return &SingleLinkedList{}
}

// GetHead 獲得頭節(jié)點
func (l *SingleLinkedList) GetHead() (error, int) {
    if l.IsEmpty() {
        return errors.New("empty list"), 0
    }

    return nil, l.head.data
}

// GetNode 獲得節(jié)點
// index 鏈表索引
func (l *SingleLinkedList) GetNode(index int) (error, int) {
    err, node := l.Node(index)

    if err != nil {
        return err, 0
    }

    return nil, node.data
}

// AddNode 插入節(jié)點
// index 索引位置岭妖,插入索引之后
// data 插入內(nèi)容
func (l *SingleLinkedList) AddNode(index, data int) error {
    if l.IsEmpty() {
        // 鏈表為空掀宋,添加頭節(jié)點
        return l.AddHead(data)
    } else if l.size == index {
        // 添加尾節(jié)點
        return l.AddTail(data)
    } else {
        // 找到需要插入節(jié)點
        err, node := l.Node(index)

        if err != nil {
            return err
        }

        newNode := &Node{
            data: data,
            next: node.next,
        }

        node.next = newNode

        l.size = l.size + 1
        return nil
    }
}

// AddHead 添加頭節(jié)點
func (l *SingleLinkedList) AddHead(data int) error {
    if l.head != nil {
        return errors.New("頭節(jié)點已經(jīng)存在")
    }

    l.head = &Node{
        data: data,
        next: nil,
    }

    l.size = 1
    return nil
}

// AddTail 添加尾節(jié)點
func (l *SingleLinkedList) AddTail(data int) error {
    err, tail := l.Node(l.size - 1)
    if err != nil {
        return err
    }

    newTail := &Node{
        data: data,
        next: nil,
    }

    tail.next = newTail
    l.size = l.size + 1

    return nil
}

// SetNode 設(shè)置節(jié)點值
func (l *SingleLinkedList) SetNode(index, data int) error {
    err, node := l.Node(index)
    if err != nil {
        return err
    } else {
        node.data = data
        return nil
    }
}

// IsEmpty 鏈表是否為空
func (l *SingleLinkedList) IsEmpty() bool {
    return l.size == 0
}

// node 獲得節(jié)點
func (l *SingleLinkedList) Node(index int) (error, *Node) {
    if l.IsEmpty() {
        return errors.New("empty list"), nil
    }

    if l.isOutSpace(index) {
        return errors.New("下標無效每强,越界疆虚。"), nil
    }

    //  TODO 二分查找

    node := l.head

    for i := 0; i < index; i++ {
        node = node.next
    }

    return nil, node
}

// isOutSpace 是否超出范圍
func (l *SingleLinkedList) isOutSpace(index int) bool {
    if l.size < index || index < 0 {
        // 越界
        return true
    }
    return false
}

func (l *SingleLinkedList) isHead(index int) bool {
    return index == 0
}

func (l *SingleLinkedList) isTail(index int) bool {
    return index == l.size-1
}

// del 刪除節(jié)點
func (l *SingleLinkedList) del(index int) error {
    if l.isHead(index) {
        // 頭節(jié)點
        err, node := l.Node(index)
        if err != nil {
            return err
        }

        node.next = nil
        return nil
    }

    if l.isTail(index) {
        // 尾節(jié)點
        err, node := l.Node(index - 1)
        if err != nil {
            return err
        }

        node.next = nil
        return nil
    }

    err, prev := l.Node(index - 1)
    if err != nil {
        return err
    }
    err, next := l.Node(index + 1)
    if err != nil {
        return err
    }

    prev.next = next

    return nil
}

// ToString
func (l *SingleLinkedList) ToString() string {
    var str = ""
    node := l.head
    var s = strconv.Itoa(node.data)
    str += s + ","

    for i := 0; i < l.size; i++ {
        if node.next != nil {
            node = node.next
            var s = strconv.Itoa(node.data)
            str += s + ","
        }
    }

    return str
}

func main() {
    // 添加節(jié)點測試
    // addNodeTest()

    // 超范圍測試
    // outSpaceTest()

    // 刪除節(jié)點
    delNodeTest()
}

func addNodeTest() {
    sll := New()
    // 添加頭節(jié)點
    sll.AddHead(0)
    // 插入節(jié)點
    sll.AddNode(1, 1)
    sll.AddNode(2, 2)
    sll.AddNode(3, 3)
    s := sll.ToString()
    fmt.Println("toString:", s)
}

func outSpaceTest() {
    sll := New()
    // 添加頭節(jié)點
    sll.AddHead(0)
    err := sll.AddNode(9, 9)
    if err != nil {
        fmt.Println(err)
    }
}

func delNodeTest() {
    sll := New()
    // 添加頭節(jié)點
    sll.AddHead(0)
    // 插入節(jié)點
    sll.AddNode(1, 1)
    sll.AddNode(2, 2)
    sll.AddNode(3, 3)

    sll.del(1)

    s := sll.ToString()
    fmt.Println("toString:", s)
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子磨淌,更是在濱河造成了極大的恐慌,老刑警劉巖凿渊,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梁只,死亡現(xiàn)場離奇詭異缚柳,居然都是意外死亡,警方通過查閱死者的電腦和手機敛纲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門喂击,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人淤翔,你說我怎么就攤上這事翰绊。” “怎么了旁壮?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵监嗜,是天一觀的道長。 經(jīng)常有香客問我抡谐,道長裁奇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任麦撵,我火速辦了婚禮刽肠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘免胃。我一直安慰自己音五,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布羔沙。 她就那樣靜靜地躺著躺涝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪扼雏。 梳的紋絲不亂的頭發(fā)上坚嗜,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機與錄音诗充,去河邊找鬼苍蔬。 笑死,一個胖子當(dāng)著我的面吹牛蝴蜓,可吹牛的內(nèi)容都是我干的银室。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼励翼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了辜荠?” 一聲冷哼從身側(cè)響起汽抚,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎伯病,沒想到半個月后造烁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體否过,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年惭蟋,在試婚紗的時候發(fā)現(xiàn)自己被綠了苗桂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡告组,死狀恐怖煤伟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情木缝,我是刑警寧澤便锨,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站我碟,受9級特大地震影響放案,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜矫俺,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一吱殉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧厘托,春花似錦友雳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至伊群,卻和暖如春考杉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背舰始。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工崇棠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人丸卷。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓枕稀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親谜嫉。 傳聞我的和親對象是個殘疾皇子萎坷,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容