golang 資料結構:單鏈表 反轉 +增刪查改
阿新 • • 發佈:2020-12-30
技術標籤:golang 單鏈表go面試
package main
import (
"fmt"
)
type student struct {
val string
next *student
}
//插入節點的時候使用
type stuCreater func(string) *student
//列印
func (s *student) trans() {
for s != nil {
fmt.Println(*s)
s = s.next
}
}
//插入節點的時候回撥, 也是建構函式
func thisCreater(val string) * student {
return &student{
val: val,
}
}
//連結串列反轉
func (s *student) reverse() *student {
if s == nil || s.next == nil {
return nil
}
head := s
p1 := s
p2 := s.next
for p1 != nil {
if p2 == nil {
//s = p1 //獲取反轉連結串列
return p1
}
p3 := p2.next
p2.next = p1
if p1 == head {
p1. next = nil
}
p1 = p2
p2 = p3
}
return nil
}
//刪個節點
func (s *student) delNode(val string) *student {
//如果刪除頭節點
if s.val == val {
head := s
s = head.next
return s
}
p1 := s
p2 := s.next
for p1 != nil {
if p2.val == val {
p1.next = p2.next
p2 = nil
return nil
}
p1 = p1.next
p2 = p1.next
}
return nil
}
//插入節點
func (s *student) insertNode(val string, sc stuCreater) {
if val == "" {
return //傳進來的不能是空
}
p1 := s
p2 := s.next
for p1.val != val {
p1 = p1.next
p2 = p2.next
}
i := sc("insert") //回撥執行
p1.next = i
i.next = p2
}
func main() {
head := &student{
val: "head",
}
tail := head
for i := 0; i < 10; i++ {
stu := &student{
val: fmt.Sprintf("val%d", i),
}
tail.next = stu
tail = stu
}
head.trans()
//測試反轉
//rev := head.reverse()
//head = rev
//head.trans()
//測試刪除
// isNewHead := head.delNode("val8")
// if isNewHead != nil {
// head = isNewHead
// }
//測試插入
head.insertNode("val1", thisCreater)
//執行增刪查改後的列印
head.trans()
// fmt.Println("------trans----")
// for rev != nil {
// fmt.Println(*rev)
// rev = rev.next
// }
}
單鏈表的golang 實現