1. 程式人生 > 其它 >golang 資料結構:單鏈表 反轉 +增刪查改

golang 資料結構:單鏈表 反轉 +增刪查改

技術標籤: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 實現