golang单链表带头节点的简单实现

85 阅读1分钟
package main

import "fmt"

type Node struct {
    data int
    next *Node
}

//尾插法
func InsertToTail(headnode *Node, newNode *Node) {
    temp := headnode
    for {
       if temp.next == nil {
          break
       }
       temp = temp.next //相当于是temp的下一个节点的地址给了temp,此时temp指向下一个
    }
    temp.next = newNode
}

//头插法
func InsertToHead(headnode *Node, newNode *Node) {
    temp := headnode
    if temp.next == nil {
       //代表所插入的元素是第一个元素
       temp.next = newNode
    } else {
       newNode.next = temp.next
       temp.next = newNode
    }
}

func PrintList(head *Node) {
    temp := head
    for {
       fmt.Printf("->%d", temp.data)
       if temp.next == nil {
          break
       }
       temp = temp.next
    }
}

func GetNode(x int) *Node {
    return &Node{
       data: x,
       next: nil,
    }
}

func main() {
    //定义一个头节点
    headNode := &Node{} //初始化一个空节点;这里是有地址的,并非是头指针;
    var head *Node      //这中形式是头指针,此时是空指针,不指向任何地址
    fmt.Printf("%p\n", head)

    InsertToTail(headNode, GetNode(2))
    InsertToTail(headNode, GetNode(3))
    InsertToTail(headNode, GetNode(4))
    InsertToTail(headNode, GetNode(5))
    InsertToTail(headNode, GetNode(6))
    InsertToHead(headNode, GetNode(7))
    InsertToHead(headNode, GetNode(8))
    InsertToHead(headNode, GetNode(9))
    PrintList(headNode.next) //去掉头节点,头节点只是辅助
}

关键点在于:

  1. 牢记指针是地址
  2. 体会temp指针的作用