單鏈表是一種鏈式存取的數據結構,用一組地址任意的存儲單元存放線性表中的數據元素。鏈表中的數據是以結點來表示的,每個結點的構成:元素(數據元素的映象) + 指針(指示后繼元素存儲位置),元素就是存儲數據的存儲單元,指針就是連接每個結點的地址數據。
golang代碼實現:
package main
import (
"fmt"
"errors"
)
//定義數據類型
type Element string
//定義節點
type linkNode struct {
Data Element //數據
Next *linkNode //指向下一個節點
}
//鏈表頭
type HeadLinkNode struct {
Length int
Node *linkNode
}
//定義節點接口
type LinkNoder interface {
Add(node Element) //增加尾部
Remove(index int) error //刪除指定位置的node
Insert(index int, node Element) //指定位置插入節點
Len() int //查詢長度
Search(node Element) int //查詢位置
Get(index int) *linkNode //查詢位置
}
func New() LinkNoder {
return &HeadLinkNode{Length: 0, Node: &linkNode{Data: "", Next: nil}}
}
//增加末尾節點
func (h *HeadLinkNode) Add(node Element) {
l := h.Node
for {
if l.Next == nil {
newNode := &linkNode{Data: node, Next: nil}
l.Next = newNode
break
} else {
l = l.Next
}
}
h.Length++
}
//刪除第INDEX位置的節點,節點從1開始計算
func (h *HeadLinkNode) Remove(index int) error {
l := h.Node
lLen := h.Len()
if index < 1 || index > lLen {
return errors.New("index error")
}
for i := 0; i < index-1; i++ {
l = l.Next
}
if index == lLen {
l.Next = nil
} else {
l.Next = l.Next.Next
}
h.Length--
return nil
}
//在鏈表的第Index位置增加節點
func (h *HeadLinkNode) Insert(index int, node Element) {
l := h.Node
lLen := h.Len()
if index < 1 || index > lLen {
return
}
for i := 0; i < index-1; i++ {
l = l.Next
}
newNode := &linkNode{Data: node, Next: l.Next}
l.Next = newNode
h.Length++
}
//查詢鏈表的長度
func (h *HeadLinkNode) Len() int {
l := h.Node
i := 0
for l.Next != nil {
i++
l = l.Next
}
if i != h.Length {
fmt.Println("------")
fmt.Println(i)
fmt.Println(h.Length)
fmt.Println("------")
}
return i
}
//查詢節點數據在第幾個
func (h *HeadLinkNode) Search(node Element) int {
l := h.Node
i := 0
for {
i++
if l.Next != nil && l.Next.Data == node {
return i
} else {
return 0
}
}
return 0
}
//獲取鏈表的第幾個節點
func (h *HeadLinkNode) Get(index int) *linkNode {
lLen := h.Len()
if index < 1 || index > lLen {
return nil
}
l := h.Node
for i := 0; i < index; i++ {
l = l.Next
}
return l
}
func main() {
l := New()
l.Add(Element("zhangsan"))
fmt.Println("wz:",l.Search(Element("zhangsan")))
l.Remove(1)
fmt.Println(l.Len())
l.Add(Element("zhangsan"))
fmt.Println(l.Len())
l.Insert(1, Element("wangwu"))
fmt.Println(l.Len())
fmt.Println(l.Remove(l.Len()))
fmt.Println(l.Len())
fmt.Println(l.Search(Element("zhangsan")))
fmt.Println(l.Search(Element("wangwu")))
fmt.Println(l.Get(l.Len()))
}