1.1.1. 一、单链表:

  • 链表是有顺序的列表。

  • 单链表一般有个head指向链表头,链表中的每一个元素指向下一个元素,形成一个串。

  • 单链表的实现如下:

package main

import "fmt"

// 链表
type Persion struct {
    Num  int
    Name string
    next *Persion // 下一个节点
}

//增加一个节点,方式1:在单链表的最后加入
func InsertNode(head *Persion, newNode *Persion) {
    //从head开始,查找最后一个结点(temp.next == nil 的节点)
    temp := head
    for {
        if temp.next == nil { //表示找到最后
            break
        }
        temp = temp.next //下一个结点
    }
    //将 newNode 加入到链表的最后
    temp.next = newNode
}

//增加一个节点,按照num的值排序
func InsertNodeByNum(head *Persion, newNode *Persion) {
    //从head开始,查找最后一个结点(temp.next == nil 的节点)
    temp := head
    flag := true
    for {
        if temp.next == nil { //表示找到最后
            break
        } else if temp.next.Num >= newNode.Num { //新节点在temp和temp.next之间。也就是temp后面
            break
        } else if temp.next.Num == newNode.Num {
            //说明我们额链表中已经有这个 no,就不插入.
            flag = false
            break
        }
        temp = temp.next //下一个结点
    }
    if !flag {
        fmt.Println("对不起,已经存在 Num=", newNode.Num)
        return
    } else {
        newNode.next = temp.next
        temp.next = newNode
    }
}
//显示链表的所有结点信息
func ListNode(head *Persion) {
    temp := head
    // 先判断该链表是不是一个空的链表
    if temp.next == nil {
        fmt.Println("空空如也。。。。")
        return
    }
    //遍历这个链表
    for {
        fmt.Printf("[%d , %s ]==>", temp.next.Num, temp.next.Name)
        temp = temp.next
        if temp.next == nil { //判断是否链表后
            break
        }
    }
}


func main() {

    //1. 先创建一个头结点
    head := &Persion{}

    p1 := &Persion{Num:100,Name:"张三",}
    p2 := &Persion{Num:101,Name:"李四",}
    p3 := &Persion{Num:99,Name:"王五",}
    // 插入链表
    InsertNodeByNum(head,p1)
    InsertNodeByNum(head,p2)
    InsertNodeByNum(head,p3)

    // 显示链表
    ListNode(head)

}

注意事项:

1、链表元素的数据结构。注意next指向下一个元素。

type Persion struct {
    Num  int
    Name string
    next *Persion // 下一个节点
}

2、实现了2个插入元素的函数:InsertNode(插入链表末尾)、InsertNodeByNum(按照编号升序插入)。

3、使用的时候,创建一个head节点。head := &Persion{}。

  • 给上面的单链表,增加一个删除节点的函数
func delNodeByNum(head *Persion,num int) {
    temp := head
    flag := false // 是否找到节点
    for {
        if temp.next == nil { //表示找到最后
            break
        } else if temp.next.Num == num {
            flag = true
            break
        }
        temp = temp.next //下一个结点
    }
    if flag { // 找到,删除节点
        temp.next = temp.next.next
    } else {
        fmt.Println("没有找到要删除的节点")
    }
}

实现思想:循环链表,比较num。

1.1.2. 二、链表实现队列。

如果链表有2个函数:从尾部加元素,从头部取出元素。那就实现了一个队列。

results matching ""

    No results matching ""