数据结构与算法 — 链表常见操作(Golang)_golang 链表值 修改,2024年最新2024Golang面试题

26 阅读2分钟

数据结构与算法 — 链表常见操作(Golang)

1 代码实现

代码:

package main

import (
	"errors"
	"fmt"
)

type Node struct {
	Data int
	Next \*Node //需要使用指针类型,因为只有指针类型才能被修改
}

var Head \*Node
var Size int

/\*\*
查找结点
\*/
func getNode(index int) (currentNode \*Node, err error) {
	if index < 0 || index >= Size {
		return nil, errors.New("超出链表范围")
	}
	tempNode := Head
	for i := 0; i < index; i++ {
		tempNode = tempNode.Next
	}
	return tempNode, nil
}

func InsertElement(data, index int) error {
	if index < 0 || index > Size {
		return errors.New("超出链表范围")
	}
	insertNode := &Node{
		Data: data,
		Next: nil,
	}

	if index == 0 { //在头部插入
		insertNode.Next = Head
		Head = insertNode
	} else if index == Size { //在尾部插入
		preNode, err := getNode(index - 1) //获取尾结点的前一个结点
		if err != nil {
			return errors.New("超出链表范围")
		}
		preNode.Next = insertNode
	} else { //中间插入
		preNode, err := getNode(index - 1) //获取尾结点的前一个结点
		if err != nil {
			return errors.New("超出链表范围")
		}
		nextNode := preNode.Next
		preNode.Next = insertNode
		insertNode.Next = nextNode
	}
	Size++
	return nil
}

func DeleteElement(index int) (deletedNode \*Node, err error) {
	if index < 0 || index >= Size {
		return nil, errors.New("超出链表范围")
	}
	if index == 0 { //删除头节点
		nextNode := Head.Next //获取头节点的下一个节点
		Head.Next = nil       //将头节点的Next指向nil
		deletedNode = Head    //返回删除的头节点
		Head = nextNode       //将nextNode设置为新的头节点
	} else if index == Size-1 { //删除尾节点
		preNode, err := getNode(index - 1)
		if err != nil {
			return nil, errors.New("超出链表范围")
		}
		deletedNode = preNode.Next
		preNode.Next = nil
	} else { //删除中间节点
		preNode, err := getNode(index - 1)
		if err != nil {
			return nil, errors.New("超出链表范围")
		}
		deletedNode = preNode.Next
		nextNode := deletedNode.Next
		deletedNode.Next = nil
		preNode.Next = nextNode
	}
	Size--
	return deletedNode, nil
}

func ShowNode() {
	tempNode := Head
	index := 1
	for tempNode.Next != nil {
		fmt.Println("第 ", index, " 个节点的数据 :", tempNode.Data)
		tempNode = tempNode.Next
		index++
	}
	//fmt.Println("尾节点的数据 :", tempNode.Data)
	fmt.Println("第 ", index, " 个节点(尾结点)的数据 :", tempNode.Data)
}

func main() {
	InsertElement(3, 0)


![img](https://p6-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/93aa10de08d94f14998a5200fdca614b~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771262939&x-signature=4i3H9wZcbShbmPPovZwoHnV%2B%2FPI%3D)
![img](https://p6-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/e9f0c40194c14e679059f81582387b19~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771262939&x-signature=i%2BAgv74zFmNdz73q9iBgF3tlOKA%3D)
![img](https://p6-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/5b49e8a9e5a540adad758823631775fb~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771262939&x-signature=GdqD6UWXU%2FIohdwqVr99R2qG9i8%3D)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://gitee.com/vip204888)**