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

30 阅读1分钟
package main

import "fmt"

type Node struct {
    data int
    next *Node
}

//尾插法
func InsertToTailNoHeadNode(head *Node, newNode *Node) *Node {
    temp := head     //借助辅助节点,为什么要借助啊,你如果还是用head去做遍历操作,链就断了
    if head == nil { //第一个节点插入的时候会走这里
       head = newNode
    } else {
       for {
          if temp.next != nil { //找到链表最后一个节点
             temp = temp.next
          } else {
             break
          }
       }
       temp.next = newNode //把新节点挂在之前链表的最后一个节点
    }
    return head
}

//头插法

func InsertToHeadNoHeadNode(head *Node, newNode *Node) *Node {
    if head == nil { //说明这是一个空指针
       head = newNode //当第一个节点来了,把第一个节点的地址赋给head,就代表head指针指向第一个节点
    } else {
       newNode.next = head //这一步好好体会,这是代表新来的节点指向了后面的节点A;有人不理解,说这不是head的么;此时的head也是指向A
       head = newNode      //改变head值,指向新来的节点,跟上一步串联起来来,链就形成了
    }
    return head
}

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 abc(nomal int) {
    nomal++
}
func main() {
    var head *Node  //这中形式是头指针,此时是空指针,不指向任何地址
    //要用head来迭代,因为go不像C那样,没有全局变量来保存
    head = InsertToTailNoHeadNode(head, GetNode(7)) 
    head = InsertToTailNoHeadNode(head, GetNode(8))
    head = InsertToTailNoHeadNode(head, GetNode(9))
    head = InsertToHeadNoHeadNode(head, GetNode(2))
    head = InsertToHeadNoHeadNode(head, GetNode(3))
    head = InsertToHeadNoHeadNode(head, GetNode(4))
    head = InsertToHeadNoHeadNode(head, GetNode(5))
    head = InsertToHeadNoHeadNode(head, GetNode(6))
    PrintList(head) //head指向head的第一个节点
}

初学者不带头节点的插入理解起来比带头节点要困难,画一画图,标出地址,一步一步拆解; 另外,这里插入函数有返回值,需要迭代,代码中也有解释。