|
|
- package timemodel
-
- import (
- "container/list"
- "fmt"
- "testing"
- )
-
- type ListItem struct {
- Val string
- }
-
- func TestList(t *testing.T) {
-
- //创建一个实例
- lst := list.New()
- //尾部添加
- lst.PushBack(&ListItem{"Leo"})
- lst.PushBack(&ListItem{"Sarah"})
- lst.PushBack(&ListItem{"Sarah"})
- lst.PushBack(&ListItem{"Sarah"})
- litem := lst.PushBack(&ListItem{"Sarah"})
- lst.PushBack(&ListItem{"Melon"})
- lst.PushBack(&ListItem{"Sarah"})
- lst.PushBack(&ListItem{"Dora"})
- lst.PushBack(&ListItem{"Eva"})
-
- // 删除litem之前所有的节点
- if err := RemoveListAllBeforeItem(lst, litem, false); err != nil {
- t.Errorf("Failed to remove")
- }
- // 打印
- for i := lst.Front(); i != nil; i = i.Next() {
- fmt.Println(i.Value.(*ListItem).Val)
- }
- return
-
- //前部添加
- lst.PushFront("day")
- //前部添加后,保存元素句柄
- element := lst.PushFront("is ")
- //在is 之后添加 mon
- lst.InsertAfter("mon", element)
- //在is 之前添加 Today
- lst.InsertBefore("Today ", element)
- //打印 輸出 Today is monday.
- // i:=lst.Front() 表示初始赋值,只会在一开始执行一次,每次循环会进行一次 i != nil 语句判断,如果返回 false,表示退出循环,反之则会执行 i = i.Next()。
- for i := lst.Front(); i != nil; i = i.Next() {
-
- fmt.Print(i.Value)
- }
- //删除 元素
- lst.Remove(element)
- fmt.Println()
- //打印 輸出 Today monday.
- for i := lst.Front(); i != nil; i = i.Next() {
-
- fmt.Print(i.Value)
- }
- fmt.Println("\nlst2输出")
- var lst2 list.List
- lst2.PushBack("one")
- lst2.PushFront("zero ")
- //打印
- for i := lst2.Front(); i != nil; i = i.Next() {
-
- fmt.Println(i.Value)
- }
- }
-
- func RemoveListAllBeforeItem(lst *list.List, delNode *list.Element, delItem bool) (err error) {
- var (
- e, el, prev, p *list.Element
- )
- // 删除litem之前所有的节点
- for e = lst.Front(); e != nil; e = e.Next() {
- if delNode == e {
- prev = e.Prev()
- if delItem {
- lst.Remove(e)
- }
- for el = prev; el != nil; el = p {
- p = el.Prev()
- lst.Remove(el)
- }
- break
- }
- }
- return
- }
-
- func RemoveListAllAfterItem(lst *list.List, delNode *list.Element, delItem bool) (err error) {
- var (
- e, el, next, n *list.Element
- )
- // 删除litem之前所有的节点
- for e = lst.Front(); e != nil; e = e.Next() {
- if delNode == e {
- next = e.Next()
- if delItem {
- lst.Remove(e)
- }
- for el = next; el != nil; el = n {
- n = el.Next()
- lst.Remove(el)
- }
- break
- }
- }
- return
- }
|