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
|
|
}
|