IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 单链表的创建、插入、删除、遍历的Go实现 -> 正文阅读

[数据结构与算法]单链表的创建、插入、删除、遍历的Go实现

package main

import (
	"errors"
	"fmt"
)

/*
带头结点的单链表

*/

type Node struct {
	key int
	value string
	next * Node
}

//创建一个链表
func newList()(head *Node) {
	head = &Node {
		next: nil,
	}
	return
}

//头插法
func addHeadList(head, newNode *Node) {
	if head.next == nil {//链表为空的时候
		head.next = newNode
	}else {
		newNode.next = head.next
		head.next = newNode
	}
}

//尾插法
func addTailList(head, newNode *Node) {
	//if head.next == nil {
	//	head.next = newNode
	//} else {
		tmp := head
		for ;tmp.next != nil; tmp = tmp.next {

		}
		tmp.next = newNode
	//}
}

//按key查找
func findNodebyKey(head *Node, key int)(keyNode *Node, err error) {
	if head.next == nil {
		fmt.Println("链表为空")
		return
	}
	flag := false
	tmp := head
	for tmp.next != nil {
		if  tmp.next.key == key {
			keyNode = tmp.next
			flag = true
		}
		tmp = tmp.next
	}
	if !flag {
		err = errors.New("链表中找不到该key对应的Node")
	}
	return

}

//按位置查找  0代表头结点
func findNodeByLocation(head *Node, seat int) (seatNode *Node, err error){
	if head.next == nil {
		err = errors.New("链表为空")
		return
	}
	if seat < 1 {
		err = errors.New("传入的位置有误,请重新操作")
		return
	}
	tmp := head
	i := 1
	for tmp.next != nil {

		if i == seat {
			seatNode = tmp.next
			return
		}
		i++
		tmp = tmp.next
	}

	//链表没那么长的情况
	err = errors.New(fmt.Sprintf("链表的长度为:%d,小于你输入的位置:%d",i-1,seat))
	return


}

//按位置插入
//下一个位置等于seat
func insertByLocation(head,insertNode *Node,seat int) (err error){
	if head.next == nil {
		err = errors.New("链表为空")
		return
	}
	if seat <1 {
		err = errors.New("传入seat参数有误,请重新操作")
		return
	}

	tmp := head
	if seat == 1{
		insertNode.next = tmp.next
		tmp.next = insertNode
		return
	}
	i :=0
	for tmp.next != nil {
		if i == seat-1 {
			//插入结点
			insertNode.next =tmp.next
			tmp.next = insertNode
			return
		}
		tmp = tmp.next
		i++
	}
	if i+1 == seat {
		tmp.next = insertNode
		return
	}

	//链表没那么长的情况
	err = errors.New(fmt.Sprintf("链表的长度为:%d,你要插入的位置:%d",i,seat))
	return
}

//按位置删除
func delByLocation(head *Node,seat int) (err error) {
	if seat <1 {
		err = errors.New("输入的位置有误")
		return
	}
	if head.next == nil {
		err = errors.New("链表为空")
		return
	}
	tmp := head
	i :=0

	for tmp.next != nil {
		if i == seat -1 { //找到要删除位置的前一个
			tmp.next = tmp.next.next //跳过下一个
			return
		}
		i++
		fmt.Printf("------i:%d------\n",i)
		tmp = tmp.next
	}
	err = errors.New(fmt.Sprintf(">>>链表的长度为:%d,你要删除的位置为:%d<<<\n",i,seat))
	return

}


//按顺序插入
func addByOrder(head,newNode *Node) {
	if head.next == nil {
		head.next = newNode
		return
	}
	//找到第一个比他大的,在前一个位置插入
	tmp := head
	for tmp.next != nil {
		if tmp.next.key > newNode.key {
			newNode.next = tmp.next
			tmp.next = newNode
			//找到并且插入完毕,退出
			return
		}
		tmp = tmp.next
	}
	//找不到比他大的情况
	tmp.next = newNode


}


//遍历的方法
func showList(head *Node) {
	if head.next == nil {
		fmt.Println("链表为空")
		return
	}
	tmp := head
	for  tmp.next != nil {
		tmp = tmp.next
		fmt.Printf("key:%d,value:%s>>>",tmp.key,tmp.value)

	}
	fmt.Println()
}

func main() {
	fmt.Println("come in main()----list")
	defer fmt.Println("out of main()---list")
	head := newList()
	node1 := &Node{
		value: "1111",
		key:1,
	}
	node2 := &Node {
		value: "2222",
		key:2,
	}

	node3 := &Node{
		value: "3333",
		key:3,
	}

	node4 := &Node {
		value :"44444",
		key:4,
	}
	node5 := &Node {
		value :"5555",
		key:5,
	}
	//addHeadList(head,node1)
	//addHeadList(head,node2)
	//addHeadList(head,node3)
	addTailList(head,node1)
	addTailList(head,node2)
	addTailList(head,node3)

	addByOrder(head,node5)
	addByOrder(head,node4)

	showList(head)
	node , err :=findNodebyKey(head,1)
	if err != nil {
		fmt.Println("err :",err)
		return
	}
	fmt.Printf("node:%#v\n",node)

	seatNode, err := findNodeByLocation(head,5)
	if err != nil {
		fmt.Println("err :",err)
		return
	}
	fmt.Printf("seatNode:%#v\n",seatNode)

	//nodeTest := &Node{
	//	key: 6666,
	//	value: "66666",
	//}
	//err =insertByLocation(head,nodeTest,7)
	err = delByLocation(head,6)
	if err != nil {
		fmt.Println(">>>>>>>>>err :",err)
		return
	}
	fmt.Println("------------------------")
	showList(head)
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-07 12:20:33  更:2021-08-07 12:22:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:17:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码