單連結串列
Node: 包含一個資料域,一個指標域(指向下一個節點)
LList : 包含頭指標(指向第一個節點),連結串列長度
連結串列的特點:不能隨機訪問,只能根據鏈一個一個查詢,查詢的時間複雜度是O(n)
type Node struct {
Data interface{}
Next *Node
}
type LList struct {
Header *Node //指向第一個節點
Length int
}
func CreateNode(v interface{}) *Node{
return &Node{v, nil}
}
func CreateList() *LList{
header := CreateNode(nil)
return &LList{header,0}
}
//往連結串列頭增加一個節點,
func (l *LList)Add(data interface{}){
newNode := CreateNode(data)
defer func() {
l.Length++
}()
if l.Length == 0 {
l.Header = newNode
}else{
newNode.Next = l.Header
l.Header = newNode //頭指標指向新加的
}
}
//往連結串列尾加一個節點
func (l *LList)Append(data interface{}){
newNode := CreateNode(data)
defer func() {
l.Length++
}()
if l.Length==0{
l.Header = newNode
}
if l.Length>0 {
current := l.Header
for current.Next != nil{ //迴圈找到最後一個節點
current = current.Next
}
current.Next = newNode //把新節點地址給最後一個節點的Next
}
}
//往i插入一個節點,後插
func (l *LList)Insert(i int, data interface{}){
defer func() {
l.Length++
}()
if i>=l.Length {
l.Append(data)
return
}
newNode := CreateNode(data)
//找到第i個節點pre和i+1個after節點
j := 1
pre := l.Header
for j!=i{
pre = pre.Next
j++
}
after := pre.Next //獲取到i+1個節點
//修改i節點,新節點的指標
pre.Next = newNode
newNode.Next = after
}
//刪除第i個節點
func (l *LList)Delete(i int){
defer func() {
l.Length--
}()
if i==1{ //刪除第一個節點,把header指向第二個節點即可
l.Header = l.Header.Next
return
}
//找到第i-1個節點,找到第i+1個節點,修改i-1的節點的next即可
j := 0
current := l.Header
for j == i-1 {
current = current.Next
j++
}
after := current.Next.Next
current.Next = after
}
//遍歷連結串列,顯示出來
func (l *LList)Scan() {
current := l.Header
i := 1
for current.Next != nil{
fmt.Printf("第%d的節點是%d\n", i, current.Data)
current = current.Next
i++
}
fmt.Printf("第%d的節點是%d\n", i, current.Data)
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結