数据结构(1)

数据结构(1)

1.链表

链表中数据呈线性排列。在单链表中添加,删除数据都为O(1),查找数据为O(n)。

在实现链表可添加一个“虚”头节点,这可以使链表操作更简便。

链表的存储可以是不连续的。

1.1数据结构

type listNode struct {
    Data interface{}
    Next *listNode
}

1.2初始化头节点

func makeList() *listNode {
    return &listNode{
        Next: nil,
    }
}

1.3建立链表

头插法

数据结构(1)_第1张图片

对应代码

temp := head.Next // 在断开指针会丢失下一节点的地址,用temp保存下一节点的地址
node := new(listNode)
head.Next = node
node.Data = data
node.Next = temp

完整代码

func HeadInsert(head *listNode, data int) {
    temp := head.Next
    node := new(listNode)
    head.Next = node
    node.Data = data
    node.Next = temp
}
尾插法

数据结构(1)_第2张图片

对应代码

node := new(listNode)
node.Data = data
last.Next = node
node.Next = nil

完整代码

func TailInsert(head *listNode, data interface{}) {
    last := head
    for last.Next != nil { // 找到last
        last = last.Next
    }

    node := new(listNode)
    last.Next = node
    node.Data = data
    node.Next = nil
}

1.4查找

在单链表中查找数据只能从头节点开始依次向后查找直到找到目标数据为止,时间复杂度为O(n).

例如:在1,2中查找2,依次比较数据是否为2,如果为2则找到;如果查找完全部还没有找到,则链表中不存在该数据。

数据结构(1)_第3张图片

func SearchNode(head *listNode, data interface{}) (*listNode, bool) {
    node := head
    for node.Next != nil {
        node = node.Next
        if node.Data == data {
            return node, true
        }
    }
    return nil, false
}

1.5删除

数据结构(1)_第4张图片

func DeleteNode(head *listNode, data interface{}) bool {
    node := head
    for node.Next != nil {
        node = node.Next
        if node.Next.Data == data {
            node.Next = node.Next.Next
            return true
        }
    }
    return false
}

你可能感兴趣的:(后端数据结构)