数据结构--单向链表

Posted Yuan_sr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构--单向链表相关的知识,希望对你有一定的参考价值。

单向链表的一种Go语言实现

package main

import "fmt"

type Node struct {
    no int
    name string
    next *Node
}

//实现尾部插入一个节点到链表(队列Push的一种实现)
func InsertTail(head *Node, newNode *Node){
    //先找到链表的最后一个节点,需要保持头结点不动,这里创建一个中间临时节点
    temp := head
    //遍历链表直到最后一个节点进行插入
    for {
        if temp.next == nil { //这个条件就是链表的最后位置
            break
        }
        temp = temp.next
    }
    //将新的节点接入到链表尾部
    temp.next = newNode
}

//实现有序插入一个节点到链表中
func InsertSort(head, newNode *Node){
    temp := head
    //重点:插入时必须要在temp的位置让temp.next.no和newNode.no进行比较,不然会错过插入时机
    for {
        if temp.next == nil { //说明已经在链表的尾部了
            //注意:下面两行的顺序不能颠倒
            newNode.next = temp.next
            temp.next = newNode
            break
        } else if temp.next.no >= newNode.no {
            newNode.next = temp.next
            temp.next = newNode
            break
        }
        temp = temp.next
    }
}

//实现头部插入节点(队列Push的一种实现)
func InsertHead(head, newNode *Node){
    newNode.next = head.next
    head.next = newNode
}

//实现一个删除链表节点的函数
func Delete(head *Node, node *Node) {
    temp := head
    for {
        if temp.next == nil { //说明已经在链表的尾部了,没有找到要删除的节点
            break
        } else if temp.next.no == node.no {
            temp.next = node.next
            //下面这种方法也可以,不过理解起来有点绕
            //temp.next = temp.next.next
            break
        }
        temp = temp.next
    }
}

//实现一个头部删除链表节点的函数(队列Pop的一种实现)
func DeleteHead(head *Node){
    if head.next == nil{
        return
    }else {
        head.next = head.next.next
    }
}

//实现一个尾部删除链表节点的函数(队列Pop的一种实现)
func DeleteTail(head *Node){
    temp := head
    for {
        if temp.next == nil{ //说明链表为空
            return
        }else if temp.next.next == nil{
            temp.next = nil
            break
        }
        temp = temp.next
    }
}

//实现显示链表中所有节点信息
func List(head *Node){
    //前提是不能改变头结点
    temp := head
    if temp.next == nil {
        fmt.Println("链表为空")
        return
    }

    for {
        fmt.Printf("%d  %s -->", temp.next.no, temp.next.name) //打印下一个节点的信息
        temp = temp.next
        if temp.next == nil {
            break
        }
    }
}

func main(){

    //定义一个头结点
    head := &Node{}
    //定义一个节点信息
    node1 := &Node{
        no:   1,
        name: "Number1",
        next: nil,
    }
    node2 := &Node{
        no:   2,
        name: "Number2",
        next: nil,
    }
    node3 := &Node{
        no:   3,
        name: "Number3",
        next: nil,
    }
    node4 := &Node{
        no:   2,
        name: "Number4",
        next: nil,
    }

    InsertTail(head, node1)
    InsertTail(head, node2)

    InsertSort(head, node3)
    InsertSort(head, node2)
    InsertSort(head, node1)
    InsertSort(head, node4)

    Delete(head, node4)

    InsertHead(head, node1)
    InsertHead(head, node2)
    InsertHead(head, node3)
    InsertHead(head, node4)
    DeleteHead(head)
    DeleteTail(head)
    List(head)
}

以上是关于数据结构--单向链表的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法什么是链表?并用代码手动实现一个单向链表

数据结构《二》链表的实现

链表的java实现(单向双向链表,单向链表的反转)

链表的java实现(单向双向链表,单向链表的反转)

php实现数据结构单向链表

Java数据结构-单向链表