package main
import "fmt"
//节点结构体
type Node struct {
data int
next *Node
}
//链表类
type List struct {
head *Node
length int
}
//创建节点
func CreateNode(data int) *Node{
return &Node{data, nil}
}
//创建链表
func NewList() *List{
return &List{
&Node{0,nil},
0,
}
}
//打印链表
func (l *List)DispList(){
pre := l.head.next
for i := 1;i <= l.length;i++{
fmt.Printf("%d ", pre.data)
pre = pre.next
}
fmt.Printf("\n")
}
//求链表长度
func (l *List)ListLength()int{
return l.length
}
//获得索引值
func (l *List)GetElem(index int) int {
pre := l.head
var j int
for j < index && pre != nil {
j++
pre = pre.next
}
if pre == nil{
return -1
} else{
return pre.data
}
}
//获得索引值
func (l *List)LocateElem(data int) int{
pre := l.head
var i int = 0
for pre != nil && pre.data != data{
pre = pre.next
i++
}
if pre == nil{
return -1
}else{
return i
}
}
//插入节点
func (l *List)ListInsert(i, data int)bool{
if i < 1{
return false
}
pre := l.head
var j int = 0
for j < i-1 && pre != nil{
j++
pre = pre.next
}
if pre == nil {
return false
}else{
s := CreateNode(data)
s.next = pre.next
pre.next = s
return true
}
}
//删除节点
func (l *List)ListDelete(i int)bool{
if i < 1 {
return false
}
pre := l.head
j := 0
for j < i-1 && pre != nil{
j++
pre = pre.next
}
if pre == nil{
return false
}else{
q := pre.next
if q == nil{
return false
}
pre.next = q.next
return true
}
}
//判断链表是否为空
func (l *List)IsEmpty()bool{
if l.head.next == nil{
return true
}
return false
}
//创建链表
func (l *List)CreateList(arr []int, n int)bool{
r := l.head
for i := 0;i < n;i++{
s := CreateNode(arr[i])
r.next = s
r = s
}
r.next = nil
l.length = n
return true
}
//查找最后一个值为x的节点序号
func (l *List)FindLastValue(x int)int{
pre := l.head.next
i := 0
j := 0
for pre != nil{
i++
if pre.data == x{
pre = pre.next
j = i
}
}
return j
}
func main(){
arr := []int{1,2,3,4,5}
list := NewList()
list.CreateList(arr, 5)
fmt.Printf("list length = %d\n", list.ListLength())
list.DispList()
fmt.Printf("%d\n", list.GetElem(2))
fmt.Printf("%d\n", list.LocateElem(4))
list.ListInsert(2,8)
list.DispList()
list.ListDelete(2)
list.DispList()
fmt.Printf("%d\n", list.FindLastValue(4))
}