美文网首页
008-golang-container/list 链表的简单使

008-golang-container/list 链表的简单使

作者: 夏大王2019 | 来源:发表于2017-12-14 19:33 被阅读140次

一.前言

需要对一个文件进行编辑,主要的操作有

  1. 修改某行的内容
  2. 插入一行获多行
  3. 删除某行

文件不是特别大的文件,所以可以加载到内存中直接处理。感觉最好的数据结构还是链表

二.golang中的链表

  1. container/list 是golang中内置的链表库
  2. 和大多数语言中内置的链表库一样,container/list 不是线程安全的。

1. container/list API接口

func (e *Element) Next() *Element  //返回该元素的下一个元素,如果没有下一个元素则返回nil
func (e *Element) Prev() *Element//返回该元素的前一个元素,如果没有前一个元素则返回nil。
func New() *List //返回一个初始化的list
func (l *List) Back() *Element //获取list l的最后一个元素
func (l *List) Front() *Element //获取list l的第一个元素
func (l *List) Init() *List  //list l初始化或者清除list l
func (l *List) InsertAfter(v interface{}, mark *Element) *Element  //在list l中元素mark之后插入一个值为v的元素,并返回该元素,如果mark不是list中元素,则list不改变。
func (l *List) InsertBefore(v interface{}, mark *Element) *Element//在list l中元素mark之前插入一个值为v的元素,并返回该元素,如果mark不是list中元素,则list不改变。
func (l *List) Len() int //获取list l的长度
func (l *List) MoveAfter(e, mark *Element)  //将元素e移动到元素mark之后,如果元素e或者mark不属于list l,或者e==mark,则list l不改变。
func (l *List) MoveBefore(e, mark *Element)//将元素e移动到元素mark之前,如果元素e或者mark不属于list l,或者e==mark,则list l不改变。
func (l *List) MoveToBack(e *Element)//将元素e移动到list l的末尾,如果e不属于list l,则list不改变。
func (l *List) MoveToFront(e *Element)//将元素e移动到list l的首部,如果e不属于list l,则list不改变。
func (l *List) PushBack(v interface{}) *Element//在list l的末尾插入值为v的元素,并返回该元素。
func (l *List) PushBackList(other *List)//在list l的尾部插入另外一个list,其中l和other可以相等。
func (l *List) PushFront(v interface{}) *Element//在list l的首部插入值为v的元素,并返回该元素。
func (l *List) PushFrontList(other *List)//在list l的首部插入另外一个list,其中l和other可以相等。
func (l *List) Remove(e *Element) interface{}//如果元素e属于list l,将其从list中删除,并返回元素e的值。

2.简单实例

import (
    "fmt"
    "os"
    "bufio"
    "io"
    "container/list"
)



type FileEditer  struct {
    Lines  *list.List
    Index    int32
}


/**
 *将文件加载到内存中
 */
func (p * FileEditer) load(input string) {
    f, err := os.Open(input)
    if err != nil {
        panic(err)
    }
    defer f.Close()

    rd := bufio.NewReader(f)
    for {
        line, err := rd.ReadString('\n') //以'\n'为结束符读入一行
        
        if err != nil || io.EOF == err {
            break
        }
        p.Lines.PushBack(line)
    }  
    
}

func (p * FileEditer) dump(input string) {

    for v:= p.Lines.Front();v!=nil; v= v.Next() {
        line := v.Value.(string)
        fmt.Printf("%+v",line)
    }

    bufio.NewReadWriter
}



func NewFileEditer() (*FileEditer) {
    p := new(FileEditer)

    p.Index =0
    p.Lines =  list.New()
    return  p
}

参考链接

  1. golang使用sync保证container/list链表线程安全

相关文章

  • 008-golang-container/list 链表的简单使

    一.前言 需要对一个文件进行编辑,主要的操作有 修改某行的内容 插入一行获多行 删除某行 文件不是特别大的文件,所...

  • leetcode第一百四十八题—排序链表

    排序链表有很多种解法,最简单的遍历链表,变成list然后list.sort,再变回有序链表就好了。但是这种做法没有...

  • redis学习系列(四)

    redis简单操作之list类型 redis里面的list类型被称为链表类型 1.lpush向链表的头部放入数据 ...

  • [链表]83. Remove Duplicates from S

    83. Remove Duplicates from Sorted List 链表很简单的题,但是对链表基本结构都...

  • Java链表

    单向链表(Single-Linked List) 单链表是链表中结构最简单的。一个单链表的节点(Node)分为两个...

  • LinkedList源码1.8

    LinkedList是一个实现了List接口和Deque接口的双端链表。 LinkedList底层的链表结构使它支...

  • LinkedList

    LinkedList是一个实现了List接口和Deque接口的双端链表。 LinkedList底层的链表结构使它支...

  • Linked List 简单的链表

    今天开始看链表 链表是一种递归型的数据结构,要么为null要么为node的结点的连结,这个 node含有一个泛型的...

  • 数据结构-线性表

    [TOC] 线性表-List list是最简单的数据结构,可分为顺序表与链表,顺序表内部数据存储由数组实现,链表则...

  • balabala List 和 Map

    简单聊下 List 和 Map 前言 本文涉及到以下内容: 简单介绍下数组和链表数组链表哈希表 简单介绍下 Ar...

网友评论

      本文标题:008-golang-container/list 链表的简单使

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