go单链表实现(梁山水浒排行榜)

链表的定义

  1. 链表是以节点的方式来存储,是链式存储
  2. 每个节点包含 data 域, next 域:指向下一个节点.
  3. 如图:发现链表的各个节点不一定是连续存储.
  4. 链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定

1.构造一个链表节点

type HeroNode struct {
	no       int
	name     string
	nickname string
	next     *HeroNode
}

2.首先插入链表节点

func InsertHeroNode2(head *HeroNode, newHeroNode *HeroNode) {
	//先找到该链表的最后结点
	temp := head
	flag := true
	for {
		if temp.next == nil {
			break //代表找到了最后
		} else if temp.next.no >= newHeroNode.no {
			break
		} else if temp.next.no == newHeroNode.no {
			flag = false
			break
		}
		temp = temp.next
	}
	if !flag {
		fmt.Println("对不起,已经存在 no=", newHeroNode.no)
		return
	} else {
		newHeroNode.next = temp.next //把交换的节点的下一个给上一个
		temp.next = newHeroNode      // 当前节点的下一个给 新插入的
	}
}

整体思路框架:
考虑这几点:
1.给予一个头节点,让它为空。
2.第二个判断是否为空链表
3.根据no来判断插入的位置
4.是否插入的位置为最后
在这里插入图片描述

3.打印出链表

很简单两步:
1.考虑是否为空链表
2.就一直循环,为空break就行

func ListHeroNode(head *HeroNode) {
	temp := head
	// 先判断该链表是不是一个空的链表
	if temp.next == nil {
		fmt.Println("空空如也。。。。")
		return
	}

	for {
		fmt.Printf("[%d , %s , %s]--->", temp.next.no, temp.next.name, temp.next.nickname)
		temp = temp.next
		if temp.next == nil {
			break
		}
	}
}

4.删除链表

func DeleteLinkedlist(head *HeroNode, forDeleteNode *HeroNode) {
	temp := head
	flag := true

	if temp.next == nil {
		fmt.Println("这个链表为空,不能删除")
	}

	for {
		if temp.next == nil {
			fmt.Println("找到最后还没有找到,不存在这个删除点")
			break
		} else if temp.next.no == forDeleteNode.no {
			fmt.Println("找到了这个节点 删除了这个节点", forDeleteNode)
			if temp.next.next == nil {
				flag = false
				break
			}
			break
		}
		temp = temp.next
	}

	if flag {
		temp.next = forDeleteNode.next
	} else {
		temp.next = nil
	}

}

思路架构图
在这里插入图片描述

5.更新节点

跟删除同理

func UpLinkedList(head *HeroNode, upDateNode *HeroNode) {
	temp := head
	flag := true
	if temp.next == nil {
		fmt.Println("不存在这个链表不能更新")
	}
	for {
		if temp.next == nil {
			fmt.Println("找到最后还没有找到,不存在这个更新点")
			break
		} else if temp.next.no == upDateNode.no {
			fmt.Println("找到了存在的更新点", *temp.next)
			if temp.next.next == nil {
				flag = false
				break
			}
			break
		}
		temp = temp.next
	}
	if flag {
		upDateNode.next = temp.next.next
		temp.next = upDateNode
	} else {
		temp.next = upDateNode
	}

}

6.全部代码

package main

import "fmt"

/*  链表的定义
1) 链表是以节点的方式来存储,是链式存储
2) 每个节点包含 data 域, next 域:指向下一个节点.
3) 如图:发现链表的各个节点不一定是连续存储.
4) 链表分带头节点的链表和没有头节点的链表,根据实际的需求来确

	需求:
	1. 完成链表的创建、增加、删除、更新、查看
*/

type HeroNode struct {
	no       int
	name     string
	nickname string
	next     *HeroNode
}

// 这种插入不推荐
func InsertHeroNode(head *HeroNode, newHeroNode *HeroNode) {
	//先找到该链表的最后结点
	temp := head
	for {
		if temp.next == nil {
			break //表示找到
		}
		temp = temp.next //没找到 就继续找
	}
	// 3.将新来的结点放在最后
	temp.next = newHeroNode

}

// 考虑 根据编号来进行链表排序
func InsertHeroNode2(head *HeroNode, newHeroNode *HeroNode) {
	//先找到该链表的最后结点
	temp := head
	flag := true
	for {
		if temp.next == nil {
			break //代表找到了最后
		} else if temp.next.no >= newHeroNode.no {
			break
		} else if temp.next.no == newHeroNode.no {
			flag = false
			break
		}
		temp = temp.next
	}
	if !flag {
		fmt.Println("对不起,已经存在 no=", newHeroNode.no)
		return
	} else {
		newHeroNode.next = temp.next //把交换的节点的下一个给上一个
		temp.next = newHeroNode      // 当前节点的下一个给 新插入的
	}
}

//删除链表
/*
三种情况,1.没有节点,还有没找到也就是说不存在
		2.通常情况,有节点
		3.节点在末尾
*/
func DeleteLinkedlist(head *HeroNode, forDeleteNode *HeroNode) {
	temp := head
	flag := true

	if temp.next == nil {
		fmt.Println("这个链表为空,不能删除")
	}

	for {
		if temp.next == nil {
			fmt.Println("找到最后还没有找到,不存在这个删除点")
			break
		} else if temp.next.no == forDeleteNode.no {
			fmt.Println("找到了这个节点 删除了这个节点", forDeleteNode)
			if temp.next.next == nil {
				flag = false
				break
			}
			break
		}
		temp = temp.next
	}

	if flag {
		temp.next = forDeleteNode.next
	} else {
		temp.next = nil
	}

}

// 跟删除同理
func UpLinkedList(head *HeroNode, upDateNode *HeroNode) {
	temp := head
	flag := true
	if temp.next == nil {
		fmt.Println("不存在这个链表不能更新")
	}
	for {
		if temp.next == nil {
			fmt.Println("找到最后还没有找到,不存在这个更新点")
			break
		} else if temp.next.no == upDateNode.no {
			fmt.Println("找到了存在的更新点", *temp.next)
			if temp.next.next == nil {
				flag = false
				break
			}
			break
		}
		temp = temp.next
	}
	if flag {
		upDateNode.next = temp.next.next
		temp.next = upDateNode
	} else {
		temp.next = upDateNode
	}

}

// 打印出来链表
func ListHeroNode(head *HeroNode) {
	temp := head
	// 先判断该链表是不是一个空的链表
	if temp.next == nil {
		fmt.Println("空空如也。。。。")
		return
	}

	for {
		fmt.Printf("[%d , %s , %s]--->", temp.next.no, temp.next.name, temp.next.nickname)
		temp = temp.next
		if temp.next == nil {
			break
		}
	}
}

func main() {
	// 创建节点
	head := &HeroNode{} //这是一个头节点

	hero1 := &HeroNode{
		no:       1,
		name:     "宋江",
		nickname: "及时雨",
	}
	//
	hero2 := &HeroNode{
		no:       2,
		name:     "卢俊义",
		nickname: "玉麒麟",
	}

	hero3 := &HeroNode{
		no:       3,
		name:     "林冲",
		nickname: "豹子头",
	}
	//InsertHeroNode(head, hero1)
	//InsertHeroNode(head, hero2)
	//InsertHeroNode(head, hero3)

	InsertHeroNode2(head, hero3)
	InsertHeroNode2(head, hero2)
	InsertHeroNode2(head, hero1)
	ListHeroNode(head)
	//fmt.Println("这是hero1:", &hero1)
	fmt.Println("")
	fmt.Println("删除后")

	DeleteLinkedlist(head, hero2)
	ListHeroNode(head)
	hero4 := &HeroNode{
		no:       3,
		name:     "吴用",
		nickname: "智多星",
	}
	UpLinkedList(head, hero4)
	ListHeroNode(head)
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值