golang 数据结构:单链表 反转 +增删查改

package main

import (
	"fmt"
)

type node struct {
	val  string
	next *node
}

type stuCreater func(string) *node

//打印
func (s *node) trans() {
	for s != nil {
		fmt.Println(*s)
		s = s.next
	}
}

func thisCreater(val string) *node {
	return &node{
		val: val,
	}
}

//链表反转
func (s *node) reverse() *node {
	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 *node) delNode(val string) *node {
	//如果删除头节点
	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 *node) 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 := &node{
		val: "head",
	}

	tail := head
	for i := 0; i < 10; i++ {
		stu := &node{
			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
	// }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值