数据结构(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建设链表

头插法

对应代码

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

残缺代码

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

对应代码

node := new(listNode)node.Data = datalast.Next = nodenode.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则找到;如果查找齐全部还没有找到,则链表中不存在该数据。

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删除

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}