数据结构之链表
package main
import "fmt"
type Node struct {
Data int
PNext *Node
}
func main() {
node := InitLinkList()
node.TravserLinkList()
node.Insert(3, 99)
node.TravserLinkList()
var val int
node.Delete(5, &val)
fmt.Println(val)
node.TravserLinkList()
}
// 创建链表
func InitLinkList() *Node {
pHead := &Node{}
if pHead == nil {
return nil
}
pTail := pHead
fmt.Println("请输入链表长度")
var length int
fmt.Scan(&length)
for i := 0; i < length; i++ {
pNew := &Node{}
fmt.Printf("请输入第%d个值\n", i+1)
var temp int
fmt.Scan(&temp)
fmt.Println("temp:", temp)
pNew.Data = temp
pTail.PNext = pNew
pTail = pNew
pTail.PNext = nil
}
return pHead
}
//输出链表
func (n *Node) TravserLinkList() {
if n.IsEmpty() {
fmt.Println("链表为空")
return
}
pNode := n.PNext
for pNode != nil {
fmt.Printf("%d,", pNode.Data)
pNode = pNode.PNext
}
fmt.Println()
}
// 判断链表为空
func (n *Node) IsEmpty() bool {
if n.PNext == nil {
return true
}
return false
}
// 向链表插入数据
// pos 插入位置后面
// val 插入值
func (n *Node) Insert(pos, val int) bool {
i := 0
pNode := n
// if n.IsEmpty() & {
// }
for pNode.PNext != nil && i < pos {
i++
pNode = pNode.PNext
}
if pNode.PNext == nil && i <= pos-1 {
return false
}
// 把当前位置phead
ptmp := pNode.PNext
node := &Node{}
node.Data = val
node.PNext = ptmp
pNode.PNext = node
return true
}
// 删除链表指定位置元素
func (n *Node) Delete(pos int, val *int) bool {
pNode := n
i := 0
// 获取指定位置之前一个节点数据
for pNode.PNext != nil && i < pos-1 {
i++
pNode = pNode.PNext
}
nTemp := pNode.PNext
if nTemp == nil {
return false
}
*val = nTemp.Data
if nTemp.PNext == nil {
pNode.PNext = nil
}
pNode.PNext = nTemp.PNext
return true
}