编程符号网的博客   ITGUEST

使用go语言对链表的实现详解

学习一门语言,最重要的事情就是了解其数据类型以及数据结构,链表作为入门之经典,不可不知道。实现了链表,也就懂得了数据结构、指针的调用关系。具体地阐述数据类型、数据结构以及内存之间的关系,笔者会另划一个篇幅。这里只是链表的基本实现,算是共同学习的心得记录了。

package main

import "fmt"

type Node struct {
    //
    Data interface{}
    // 后继节点指针
    Next *Node
}
// 链表是否为空
func IsEmpty(node *Node) bool {
    return node == nil
}
// 是否是最后一个节点
func IsLast(node *Node) bool  {
    return node.Next == nil
}
// 查找前驱节点
func FindPrevious(index int, list *Node) *Node{
    temp := list
    if index == 0{
        return temp
    }
    for i:=0;i<index-1;i++{
        temp = temp.Next
    }
    return temp
}
// 插入节点
func InsertList(index int,list *Node,data int)  {
    temp := list
    if index == 0{
        temp.Data = data
        return
    }
    if index <0{
        fmt.Println("索引不合法")
        return
    }
    // 查找当前索引位置
    for i := 0;i<index;i++{
        if IsEmpty(temp){
            fmt.Println("索引越界")
            return
        }
        temp = temp.Next
    }

    // 创建新节点
    newNode :=Node{Data: data}
    // 新节点的Next指针指向当前位置
    newNode.Next = temp
    // 查找前驱节点
    pre := FindPrevious(index,list)
    // 前驱节点的Next指针指向新节点
    pre.Next = &newNode
}
// 删除节点
func DeleteNode(index int,list *Node)  {
    temp := list
    if index == 0{
        return
    }
    // 查找当前索引位置
    for i := 0;i<index;i++{
        temp = temp.Next
    }
    // 查找前驱节点
    pre := FindPrevious(index,list)
    // 前驱节点的Next指针指向后驱节点即可删除当前
    pre.Next = temp.Next

}
// 末尾添加节点
func Append(list *Node,node *Node)  {
    
    for list != nil {
        temp := list.Next
        if temp == nil{
            list.Next = node
            break
        }
        list = list.Next
    }
}
// 打印所有的List
func PrintList(list *Node)  {
    temp := list
    for temp != nil {
        fmt.Println(temp.Data)
        temp = temp.Next
    }
}

func main()  {
    // 创建头节点
    headNode := &Node{
        Data: 0,
        Next: nil,
    }
    node1 := &Node{
        Data: 1,
    }
    node2 := &Node{
        Data: 2,
    }
    
    Append(headNode,node1)
    Append(headNode,node2)
    InsertList(1,headNode,10)
    DeleteNode(3,headNode)
    PrintList(headNode)
}

 

posted @ 2021-09-05 16:11  java虾米  阅读(230)  评论(0)    收藏  举报