美文网首页
数组与链表

数组与链表

作者: hewolf | 来源:发表于2020-09-14 20:47 被阅读0次

数组

  • 数组最大的特点是可以根据下标随机访问,因为它有连续的内存空间
  • 缺点是删除和插入要搬移数据
  • 下标访问的时间复杂度是O(1)
  • 插入和删除操作最坏的时间复杂度是O(N)

链表

  • 链表不需要连续的内存空间,通过指针串联不相邻的内存块
  • 下标随机访问O(N)
  • 插入和删除的时间复杂度是O(1)

单链表的实现

//单链表实现
type SKNode struct {
    Next *SKNode
    Data interface{}
}

func NewSKNode(data interface{}) *SKNode {
    return &SKNode{Data: data}
}

type SKList struct {
    Head *SKNode
    Tail *SKNode
}

func (s *SKList) AppendToTail(d interface{}) {
    end := NewSKNode(d)
    if s.Head == nil {
        s.Head = end
    }
    s.Tail.Next = end
    s.Tail = end
}
func (s *SKList) Delete(d interface{}) {
    h := s.Head
    if h.Data == d {
        s.Head = nil
        s.Tail = nil
        return
    }
    for h.Next != nil {
        if h.Next.Data == d {
            if h.Next == s.Tail {
                s.Tail = h
            }
            h.Next = h.Next.Next
            return
        }
        h = h.Next
    }
}

双链表的实现

type DKNode struct {
    Pre  *DKNode
    Next *DKNode
    Data interface{}
}

func NewDKNode(data interface{}) *DKNode {
    return &DKNode{Data: data}
}

type DKList struct {
    Head *DKNode
    Tail *DKNode
}

func (s *DKList) AppendToTail(d interface{}) {
    n := NewDKNode(d)
    if s.Head == nil {
        s.Head = n
        s.Tail = n
        n.Pre = s.Head
        return
    }
    s.Tail.Next = n
    n.Pre = s.Tail
    s.Tail = s.Tail.Next
}

func (s *DKList) AppendToHead(d interface{}) {
    n := NewDKNode(d)
    if s.Head == nil {
        s.Head = n
        s.Tail = n
        n.Pre = s.Head
        return
    }
    s.Head.Pre = n
    n.Next = s.Head
    s.Head = s.Head.Pre
}

func (s *DKList) Delete(d interface{}) {
    h := s.Head
    if h.Data == d {
        s.Head = nil
        s.Tail = nil
        return
    }
    for h.Next != nil {
        if h.Next.Data == d {
            if h.Next == s.Tail {
                s.Tail = h
            }
            if h.Next.Next != nil {
                h.Next.Next.Pre = h
            }
            h.Next = h.Next.Next
            return
        }
        h = h.Next
    }
}

相关文章

  • 数据结构-链表

    章节 动态数组 & 栈 & 队列 与 链表的不同 链表特性 & 图示 链表实现 & 各操作时间复杂度分析 动态数组...

  • python笔试面试项目实战2020百练2选择排序冒泡排序

    链表与数组 链表的优势在插入元素方面,需要随机地读取元素时,数组的效率很高,因为可迅速找到数组的任何元素。在链表中...

  • 数据结构和算法

    1、数组和链表区别(1)物理存储结构不同。链表与数组在计算中存储元素采用不同的存储结构,数组是顺序存储结构,链表是...

  • 数据结构与算法之美 —— 如何实现LRU缓存淘汰算法?(总结)

    链表与数组 链表定义: 百度百科 数组定义:百度百科 总结:链表和数组最大差别是在内存空间结构上,连续(数组)和...

  • 链表

    链表 缺点:查找复杂有点:定点删除/插入元素 单链表 双向链表 循环链表 双向循环链表 数组与链表的区别 数据存储...

  • 算法与数据结构(四)栈与队列

    上次聊到数组与链表,它们都是线性表,数组与链表的本质区别是内存是否连续,进而得出结论:数组可以在 O(1) 时间复...

  • 大数据(架构师)面试系列(5)

    1.数组与链表的区别是什么? 线性表--数组和链表的区别链表和数组的区别在哪里? 2.Scala函数式编程的特点?...

  • Java集合源码分析之Map(一):超级接口Map

    数组与链表在处理数据时各有优缺点,数组查询速度很快而插入很慢,链表在插入时表现优秀但查询无力。哈希表则整合了数组与...

  • 三、数据结构与算法 — 链表

    链表与数组的区别 链表不是连续的 单链表与循环链表 注意链表中的头结点和尾结点。 循环链表从尾可以方便的到头,适合...

  • 静态链表及C#实现

    静态链表 静态链表是用数组模拟动态链表。 静态链表结构描述 首先,静态链表使用数组来模拟动态链表。数组存放一个节点...

网友评论

      本文标题:数组与链表

      本文链接:https://www.haomeiwen.com/subject/fjltyktx.html