zoukankan      html  css  js  c++  java
  • Golang:List

    List的接口

     1 func New() *List                                                    //创建List
     2 func (l *List) Back() *Element                                      //返回List的上一个元素
     3 func (l *List) Front() *Element                                     //返回List下一个元素
     4 func (l *List) Init() *List                                         //初始化List
     5 func (l *List) InsertAfter(v interface{}, mark *Element) *Element   //在指定节点后插入,成功返回插入节点的指针,失败返回nil, 时间复杂度O(1)
     6 func (l *List) InsertBefore(v interface{}, mark *Element) *Element  //在指定节点之前插入, 成功返回插入节点的指针,失败返回nil, 时间复杂度O(1)
     7 func (l *List) Len() int                                            //返回链表长度,时间复杂度O(1)
     8 func (l *List) MoveAfter(e, mark *Element)                          //移动节点e到mark节点之后,时间复杂度O(1), 处理方式:先删除然后再插入
     9 func (l *List) MoveBefore(e, mark *Element)                         //移动节点e到mark节点之前,时间复杂度O(1), 处理方式:先删除然后再插入
    10 func (l *List) MoveToBack(e *Element)                               //移动节点e到链表的尾部
    11 func (l *List) MoveToFront(e *Element)                              //移动节点e到链表的头部
    12 func (l *List) PushBack(v interface{}) *Element                     //在链表尾部追加值为v的新节点
    13 func (l *List) PushBackList(other *List)                            //把链表other所有节点追加到当前链表的尾部
    14 func (l *List) PushFront(v interface{}) *Element                    //在链表的头部插入新节点
    15 func (l *List) PushFrontList(other *List)                           //把链表other所有节点追加到当前链表头部
    16 func (l *List) Remove(e *Element) interface{}                       //删除指定节点

    从这些接口我们可以看到Go的list应该是一个双向链表,不然InsertBefore这种操作应该不会放出来。

    然后我们再从源码看看List的结构

     1 // Element is an element of a linked list.
     2 type Element struct {
     3     // Next and previous pointers in the doubly-linked list of elements.
     4     // To simplify the implementation, internally a list l is implemented
     5     // as a ring, such that &l.root is both the next element of the last
     6     // list element (l.Back()) and the previous element of the first list
     7     // element (l.Front()).
     8     next, prev *Element
     9 
    10     // The list to which this element belongs.
    11     list *List
    12 
    13     // The value stored with this element.
    14     Value interface{}
    15 }
    1 // List represents a doubly linked list.
    2 // The zero value for List is an empty list ready to use.
    3 type List struct {
    4     root Element // sentinel list element, only &root, root.prev, and root.next are used
    5     len  int     // current list length excluding (this) sentinel element
    6 }

    从这里证实了上面的猜想,这是一个双向链表

    List的使用

     1 package main
     2 
     3 import (
     4     "container/list"
     5     "fmt"
     6 )
     7 
     8 func main() {
     9 
    10     list0 := list.New()
    11     e4 := list0.PushBack(4)
    12     e1 := list0.PushFront(1)
    13     list0.InsertBefore(3, e4)
    14     list0.InsertAfter(2, e1)
    15 
    16     for e := list0.Front(); e != nil; e = e.Next() {
    17         fmt.Print(e.Value, " ")
    18     }
    19     fmt.Println("
    ")
    20 
    21     front := list0.Front()
    22     back := list0.Back()
    23 
    24     fmt.Println("front is:", front.Value)
    25     fmt.Println("back is:", back.Value)
    26     fmt.Println("length is", list0.Len())
    27 
    28     list0.InsertBefore(0, front)
    29     list0.InsertAfter(5, back)
    30 
    31     list0.PushFront(-1)
    32     list0.PushBack(6)
    33     for e := list0.Front(); e != nil; e = e.Next() {
    34         fmt.Print(e.Value, " ")
    35     }
    36     fmt.Println("
    ")
    37     list0.Remove(list0.Front())
    38     for e := list0.Front(); e != nil; e = e.Next() {
    39         fmt.Print(e.Value, " ")
    40     }
    41 
    42     fmt.Println("
    ")
    43     list1 := list.New()
    44     list1.PushBack(7)
    45     list1.PushBack(8)
    46     list0.PushBackList(list1)
    47     for e := list0.Front(); e != nil; e = e.Next() {
    48         fmt.Print(e.Value, " ")
    49     }
    50     fmt.Println("
    ")
    51 }

    10-14行往list写入1,2,3,4

    16行遍历打印list

    21-16行打印front 和back节点

    42-48行把另一个list追加到list的back

    运行结果是:

    1 2 3 4 
    front is: 1
    back is: 4
    length is 4
    -1 0 1 2 3 4 5 6 
    0 1 2 3 4 5 6 
    0 1 2 3 4 5 6 7 8 
  • 相关阅读:
    [javaSE] 数组(获取最值)
    [javascript] Promise简单学习使用
    [javaSE] 基本类型(String相关)
    [android] 手机卫士黑名单功能(ListView结合SQLite增删改)
    [PHP] 重回基础(IO流)
    [PHP] 重回基础(Array相关函数)
    [PHP] 重回基础(date函数和strtotime函数)
    [HTML5] Canvas绘制简单图片
    [javaSE] 集合框架(TreeSet)
    [android] 手机卫士黑名单功能(ListView优化)
  • 原文地址:https://www.cnblogs.com/13579net/p/10119106.html
Copyright © 2011-2022 走看看