package main
import(
"fmt"
"errors"
)
type Node struct{
Value interface{}
Next *Node
}
type LinkList struct{
head *Node
size int //统计链表中元素的个数
num int //限制链表的最大长度
}
func NewLinkList(num int) *LinkList{
if num <=0{
num = 100
}
return &LinkList{
num:num,
}
}
//在头部插入,暂时不限制链表的长度
func (link *LinkList)Head(val interface{})(bool,error) {
if link.size >= link.num{
return false,errors.New("链表容量达到上限,请进行扩容")
}
if link.head == nil {
node := &Node{
Value: val,
Next: nil,
}
link.head = node
link.size++
}else{
node := &Node{
Value: val,
Next: link.head,
}
link.head = node
link.size++
}
return true,nil
}
//在尾部添加元素
func (link *LinkList) After(val interface{}) (bool,error){
if link.size >= link.num{
return false,errors.New("链表容量达到上限,请进行扩容")
}
node := link.head
if node == nil{
newNode := &Node{
Value:val,
}
link.head = newNode
link.size++
return false,nil
}
for{
if node.Next != nil {
node = node.Next
}else{
break
}
}
newNode := &Node{
Value:val,
}
node.Next = newNode
link.size++
return true,nil
}
//遍历输出链表
func (link *LinkList) Range()(slice []interface{}){
node := link.head
if node == nil {
return
}
for{
slice = append(slice,(*node).Value)
node = node.Next
if node == nil {
break
}
}
return
}
func (link *LinkList) Size() int{
return link.size
}
//在指定索引位置插入元素
func (link *LinkList) Insert(index int,val interface{})(bool,error){
if index <0 || index >= link.size{
return false,errors.New("index out of bounds")
}
var count int = 1
node := link.head
if node == nil {
newNode := &Node{
Value: val,
}
link.head = newNode
link.size++
return true,nil
}
if index == 0{
newNode := &Node{
Value:val,
Next:link.head,
}
link.head = newNode
link.size++
return true,nil
}
for{
node = node.Next
if count == index{
break
}
count++
}
newNode := &Node{
Value:node.Value,
Next:node.Next,
}
node.Value = val
node.Next = newNode
link.size++
return true,nil
}
//根据索引来删除
func (link *LinkList) DeleteByIndex(index int)(bool,error){
if index < 0 || index >= link.size{
return false,errors.New("index out of bounds")
}
var count int = 0
node := link.head
if node == nil {
return true,nil
}
if index == 0{
link.head = link.head.Next
link.size--
return true,nil
}
count = 1
for{
node = node.Next
if count == index-1{
break
}
count++
}
if node == nil {
return true,errors.New("link list is emtpy")
}
node.Next = node.Next.Next
link.size--
return true,nil
}
//根据值来删除node
func (link *LinkList) DeleteByValue(value interface{})(bool,error){
node := link.head
if node == nil {
return false,errors.New("link list is empty")
}
if node.Value == value{
link.head = node.Next
link.size--
return true,nil
}
var last [2]*Node
for{
last[0] = node
if node.Next == nil {
break
}
node = node.Next
if node.Value == value{
last[1] = node
break
}
}
if node == nil {
return false,errors.New("link list is emtpy")
}
fmt.Printf("last[0]:%#v, last[1]:%#v\n",last[0],last[1])
if last[1] == nil{
return false,errors.New("%v not foud in link list")
}
if last[1].Next == nil{
last[0].Next = nil
last[1] = nil
}else{
last[0].Next = last[1].Next
}
link.size--
return true,nil
}
//假定任务数据是int类型的,实际应用中做类型断言
func (link *LinkList) BubbleSort(arr []interface{}){
for i:=0; i < len(arr);i++{
for j:=0; j <len(arr)-i-1;j++{
if arr[j].(int) > arr[j+1].(int){
arr[j],arr[j+1] = arr[j+1],arr[j]
}
}
}
}
//假定任务数据是int类型的,实际应用中做类型断言
func (link *LinkList) BinarySearch(arr []interface{},leftIndex int,rightIndex int,val int)(i int){
if leftIndex > rightIndex{
return -1
}
middle := (leftIndex+rightIndex)/2
if arr[middle].(int) > val{
return link.BinarySearch(arr,leftIndex,middle-1,val)
} else if arr[middle].(int)< val{
return link.BinarySearch(arr,middle+1,rightIndex,val)
} else{
return middle
}
return middle
}
//自动扩容
func (link *LinkList) check(){
}
func main(){
link := NewLinkList(1000)
/*link.Head(1)
link.Head(2)
link.Head(3)
link.Head(4)
*/
link.After(1)
link.After(2)
link.After(3)
link.After(4)
link.Head(10)
link.Head(30)
link.Head(40)
link.Head(10)
link.After(8)
link.After(22)
fmt.Println(link.Range())
fmt.Println("link list size:",link.Size())
/*link.Insert(link.Size()-1,5)
fmt.Println(link.Range())
link.Insert(link.Size()-1,6)
fmt.Println(link.Range())
*/
arr := link.Range()
link.BubbleSort(arr)
fmt.Println(arr)
index := link.BinarySearch(arr,0,len(arr)-1,40)
fmt.Printf("40 in arr of index:%d\n",index)
index = link.BinarySearch(arr,0,len(arr)-1,1)
fmt.Printf("1 in arr of index:%d\n",index)
index = link.BinarySearch(arr,0,len(arr)-1,4)
fmt.Printf("4 in arr of index:%d\n",index)
fmt.Println("\n\n")
/*
fmt.Println("link list size:",link.Size())
fmt.Println(link.Range())
link.DeleteByValue(2)
fmt.Println("link list size:",link.Size())
fmt.Println(link.Range())
fmt.Println("\n\nlink list size:",link.Size())
fmt.Println(link.Range())
link.DeleteByValue(3)
fmt.Println("link list size:",link.Size())
fmt.Println(link.Range())
fmt.Println("\n\nlink list size:",link.Size())
fmt.Println(link.Range())
link.DeleteByValue(4)
fmt.Println("link list size:",link.Size())
fmt.Println(link.Range())
fmt.Println("\n\nlink list size:",link.Size())
fmt.Println(link.Range())
link.DeleteByValue(4)
fmt.Println("link list size:",link.Size())
fmt.Println(link.Range())
fmt.Println("\n\n")
*/
/**fmt.Println("\n删除操作:")
fmt.Println(link.Range())
fmt.Println("之前link list size:",link.Size())
link.DeleteByIndex(0)
fmt.Println("之后link list size:",link.Size())
fmt.Println(link.Range())
*/
/*
fmt.Println("\n删除操作:")
fmt.Println(link.Range())
fmt.Println("之前link list size:",link.Size())
link.DeleteByIndex(link.Size()-1)
fmt.Println("之后link list size:",link.Size())
fmt.Println(link.Range())
fmt.Println("\n删除操作:")
fmt.Println("之前link list size:",link.Size())
fmt.Println(link.Range())
link.DeleteByIndex(2)
fmt.Println("之后link list size:",link.Size())
fmt.Println(link.Range())
fmt.Println("\n删除操作:")
fmt.Println("之前link list size:",link.Size())
fmt.Println(link.Range())
link.DeleteByIndex(3)
fmt.Println("之后link list size:",link.Size())
fmt.Println(link.Range())
fmt.Println("\n删除操作:")
fmt.Println("之前link list size:",link.Size())
fmt.Println(link.Range())
link.DeleteByIndex(2)
fmt.Println("之后link list size:",link.Size())
fmt.Println(link.Range())
fmt.Println("\n删除操作:")
fmt.Println("之前link list size:",link.Size())
fmt.Println(link.Range())
link.DeleteByIndex(0)
fmt.Println("之后link list size:",link.Size())
fmt.Println(link.Range())
fmt.Println("\n删除操作:")
fmt.Println("之前link list size:",link.Size())
fmt.Println(link.Range())
_,err :=link.DeleteByIndex(0)
fmt.Println("err:",err)
fmt.Println("之后link list size:",link.Size())
fmt.Println(link.Range())
fmt.Println("\n删除操作:")
fmt.Println("之前link list size:",link.Size())
fmt.Println(link.Range())
_,err =link.DeleteByIndex(0)
if err != nil {
fmt.Printf("err:%v\n",err)
return
}
fmt.Println("之后link list size:",link.Size())
fmt.Println(link.Range())
*/
}
单链表(golang版本)
最新推荐文章于 2024-05-20 23:29:47 发布