单链表(golang版本)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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())
	*/


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值