鏈表node
type Student struct { Name string Next* Student }
每一個節點包含下一個節點的地址,這樣把全部的節點串起來了,一般把鏈表中的第一個節點叫作鏈表頭指針
package main import ( "fmt" ) type Student struct { Id int Name string Age int next *Student } func trans(p *Student){ for p != nil { fmt.Println(*p) p = p.next } fmt.Println() } func main() { var head Student head.Id = 0 head.Name = "head" head.Age = 18 var s1 Student s1.Id = 1 s1.Name = "stu1" s1.Age = 20 head.next=&s1 var s2 Student s2.Id = 2 s2.Name = "stu2" s2.Age = 20 s1.next=&s2 trans(&head) var s3 Student s3.Id = 3 s3.Name = "stu3" s3.Age = 20 s2.next=&s3 trans(&head) }
插入節點:尾部插入code
package main import ( "fmt" "math/rand" ) type Student struct { Id int Name string Age int next *Student } func trans(p *Student){ for p != nil { fmt.Println(*p) p = p.next } fmt.Println() } func insertTail(p *Student) { var tail = p for i := 0; i < 10; i++ { stu := Student{ Id: rand.Intn(10), Name: fmt.Sprintf("stu%d", i), Age: rand.Intn(100), } tail.next = &stu tail = &stu } } func main() { var head Student head.Id = 0 head.Name = "head" head.Age = 18 insertTail(&head) trans(&head) }
插入節點:頭部插入接口
package main import ( "fmt" "math/rand" ) type Student struct { Id int Name string Age int next *Student } func trans(p *Student){ for p != nil { fmt.Println(*p) p = p.next } fmt.Println() } func insertTail(p *Student) { var tail = p for i := 0; i < 10; i++ { stu := Student{ Id: rand.Intn(10), Name: fmt.Sprintf("stu%d", i), Age: rand.Intn(100), } tail.next = &stu tail = &stu } } func insertHead(p **Student) { //var tail = p for i := 0; i < 10; i++ { stu := Student{ Id: rand.Intn(10), Name: fmt.Sprintf("stu%d", i), Age: rand.Intn(100), } stu.next = *p *p = &stu } } func main() { //var head *Student = &Student{} var head *Student = new(Student) head.Id = 0 head.Name = "head" head.Age = 18 insertTail(head) insertHead(&head) trans(head) }
添加和刪除string
package main import ( "fmt" ) type Student struct { Id int Name string Age int next *Student } func trans(p *Student) { for p != nil { fmt.Println(*p) p = p.next } fmt.Println() } func delNode(p *Student) { var prev *Student = p for p != nil { if p.Id == 100 { prev.next = p.next break } prev = p p = p.next } } func addNode(p *Student, newNode *Student) { for p != nil { if p.Name == "head" { newNode.next = p.next p.next = newNode break } p = p.next } } func main() { var head *Student = new(Student) head.Id = 0 head.Name = "head" head.Age = 18 var s1 Student s1.Id = 1 s1.Name = "stu1" s1.Age = 20 head.next=&s1 var s2 Student s2.Id = 2 s2.Name = "stu2" s2.Age = 20 s1.next=&s2 var newNode *Student = new(Student) newNode.Name = "greg" newNode.Age = 18 newNode.Id = 100 addNode(head, newNode) trans(head) delNode(head) trans(head) }
雙鏈表定義import
type Student struct { Name string Next* Student Prev* Student }
若是有兩個指針分別指向前一個節點和後一個節點,咱們叫作雙鏈表二叉樹
二叉樹遍歷
type Student struct { Id int Name string left* Student right* Student }
若是每一個節點有兩個指針分別用來指向左子樹和右子樹,咱們把這樣的結構叫作二叉樹im
package main import "fmt" type Student struct { Id int Name string Age int left *Student right *Student } func trans(root *Student) { if root == nil { return } //前序遍歷 fmt.Println(root) trans(root.left) trans(root.right) //中序遍歷 //trans(root.left) //fmt.Println(root) //trans(root.right) //後續遍歷 //trans(root.left) //trans(root.right) //fmt.Println(root) } func main() { var root *Student = new(Student) root.Id = 1 root.Name = "s1" root.Age = 18 var left1 *Student = new(Student) left1.Id = 2 left1.Name = "s2" left1.Age = 18 root.left = left1 var right1 *Student = new(Student) right1.Id = 4 right1.Name = "s4" right1.Age = 18 root.right = right1 var left2 *Student = new(Student) left2.Id = 3 left2.Name = "s3" left2.Age = 18 left1.left = left2 trans(root) }
用接口實現一個通用鏈表鏈表
package main import "fmt" type LinkNode struct { data interface{} next *LinkNode } type Link struct { head *LinkNode tail *LinkNode } func (p *Link) InsertHead(data interface{}) { node := &LinkNode{ data: data, next: nil, } if p.tail == nil && p.head == nil { p.tail = node p.head = node return } node.next = p.head p.head = node } func (p *Link) InsertTail(data interface{}) { node := &LinkNode{ data: data, next: nil, } if p.tail == nil && p.head == nil { p.tail = node p.head = node return } p.tail.next = node p.tail = node } func (p *Link) Trans() { q := p.head for q != nil { fmt.Println(q.data) q = q.next } } func main() { var link Link for i := 0; i < 10; i++ { //intLink.InsertHead(i) link.InsertTail(fmt.Sprintf("str %d", i)) } link.Trans() }