数据结构--双向链表

Posted Yuan_sr

tags:

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

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

package main

import "fmt"

//定义节点信息
type dNode struct {
    id int
    name string
    pre *dNode
    next *dNode
}

//尾部插入节点
func dInsertTail(head, newNode *dNode) {
    //定义一个临时游走变量
    temp := head
    for {
        if temp.next == nil{
            break //游走到链表尾部后跳出循环进行插入数据
        }
        temp = temp.next
    }

    //尾部添加相对简单
    temp.next = newNode
    newNode.pre = temp
}

//头部插入节点
func dInsertHead(head, newNode *dNode) {
    temp := head
    //先连接新节点的两条链到链表
    newNode.next = temp.next
    newNode.pre = temp
    //再拆旧连接到新连接上
    temp.next = newNode
    temp.next.pre = newNode
}

//顺序插入节点
func dInsertSort(head, newNode *dNode){
    temp := head
    for {
        if temp.next == nil{
            newNode.next = temp.next
            newNode.pre = temp
            temp.next = newNode
            //temp.next.pre = newNode
            break
        } else if temp.next.id >= newNode.id {
            newNode.next = temp.next
            newNode.pre = temp
            temp.next = newNode
            temp.next.pre = newNode
            break
        }
        temp = temp.next
    }
}

//头部删除节点
func dDeleteHead(head *dNode){
    if head.next == nil{
        return
    }else {
        head.next = head.next.next
    }
}

//尾部删除节点
func dDeleteTail(head *dNode){
    temp := head

    for {
        if temp.next == nil {
            return
        } else if temp.next.next == nil{
            //删除节点
            temp.next = nil
            break
        }
        temp = temp.next
    }
}

//删除指定节点
func dDeleteNode(head, node * dNode){
    temp := head
    for {
        if temp.next == nil {
            return
        }else if temp.next.id == node.id {
            temp.next = temp.next.next
            temp.next.pre = temp
            break
        }
        temp = temp.next
    }
}

//显示链表元素
func dList(head *dNode){
    temp := head
    if temp.next == nil {
        fmt.Println("链表为空")
        return
    }
    for {
        //注意这里,我所有的思路都是在链表的当前节点操作下一个节点
        fmt.Printf("%d  %s --> ", temp.next.id, temp.next.name)
        temp = temp.next
        if temp.next == nil{
            break
        }
    }
}

func main(){
    head := &dNode{}

    node1 := &dNode{
        id:   0,
        name: "number1",
        pre:  nil,
        next: nil,
    }
    node2 := &dNode{
        id:   1,
        name: "number2",
        pre:  nil,
        next: nil,
    }
    node3 := &dNode{
        id:   2,
        name: "number3",
        pre:  nil,
        next: nil,
    }
    node4 := &dNode{
        id:   3,
        name: "number4",
        pre:  nil,
        next: nil,
    }
    dInsertHead(head, node1)
    dInsertTail(head, node3)
    dInsertSort(head, node2)
    dInsertSort(head, node4)
    dDeleteHead(head)
    dDeleteTail(head)
    dDeleteNode(head, node2)
    dList(head)
}

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

数据结构之带头结点的循环双向链表详细图片+文字讲解

数据结构与算法—— * 双向链表 *

《链表》之带头双向循环链表

7L-双线链表实现

数据结构带头双向循环链表

Java数据结构—双向链表