golang 实现双向链表

admin 2024-09-21 20:41:49 编程 来源:ZONE.CI 全球网 0 阅读模式

双向链表是一种常用的数据结构,能够在O(1)的时间复杂度下实现插入、删除和查找操作。在Golang中,我们可以使用指针和结构体来实现双向链表。本文将介绍如何使用Golang编写双向链表。

定义链表节点

首先,我们需要定义一个链表节点的结构体,每个节点包含两个指针,分别指向前一个节点和后一个节点。另外,还需要一个存储数据的字段。

type Node struct {
    prev  *Node
    next  *Node
    value interface{}
}

初始化链表

接下来,我们需要定义一个链表结构体,并初始化一个空链表。链表结构体包含一个头节点和一个尾节点。

type LinkedList struct {
    head *Node
    tail *Node
}

通过初始化一个空链表,我们将头节点和尾节点都指向nil。

func NewLinkedList() *LinkedList {
    return &LinkedList{}
}

插入操作

链表的插入操作分为两种情况:在链表的头部插入和在链表的尾部插入。在头部插入时,我们只需要更新头节点的指针即可。在尾部插入时,我们需要更新尾节点的指针。

func (list *LinkedList) InsertHead(value interface{}) {
    newNode := &Node{value: value}
    if list.head == nil {
        list.head = newNode
        list.tail = newNode
    } else {
        newNode.next = list.head
        list.head.prev = newNode
        list.head = newNode
    }
}

func (list *LinkedList) InsertTail(value interface{}) {
    newNode := &Node{value: value}
    if list.tail == nil {
        list.head = newNode
        list.tail = newNode
    } else {
        newNode.prev = list.tail
        list.tail.next = newNode
        list.tail = newNode
    }
}

删除操作

链表的删除操作也分为两种情况:删除头节点和删除尾节点。删除头节点时,我们需要更新头节点的指针。删除尾节点时,我们需要更新尾节点的指针。

func (list *LinkedList) DeleteHead() (interface{}, bool) {
    if list.head == nil {
        return nil, false
    }
    value := list.head.value
    list.head = list.head.next
    if list.head == nil {
        list.tail = nil
    } else {
        list.head.prev = nil
    }
    return value, true
}

func (list *LinkedList) DeleteTail() (interface{}, bool) {
    if list.tail == nil {
        return nil, false
    }
    value := list.tail.value
    list.tail = list.tail.prev
    if list.tail == nil {
        list.head = nil
    } else {
        list.tail.next = nil
    }
    return value, true
}

遍历链表

我们可以通过遍历链表的节点,依次输出节点的值。从头节点开始遍历,直到尾节点。

func (list *LinkedList) Traverse() {
    current := list.head
    for current != nil {
        fmt.Println(current.value)
        current = current.next
    }
}

至此,我们已经实现了双向链表的基本操作。使用Golang编写双向链表简单明了,但又非常实用。双向链表在一些场景中能够发挥重要作用,比如LRU Cache。

TypeScript学习笔记 编程

TypeScript学习笔记

TypeScript学习笔记[TOC]TypeScript概述TypeScript是微软开发的一个开源的编程语言,通过在JavaScript的基础上添加静态类型
高德地图JSAPI学习笔记 编程

高德地图JSAPI学习笔记

[toc]概述地图 JS API 2.0 是高德开放平台免费提供的第四代 Web 地图渲染引擎, 以 WebGL 为主要绘图手段,本着“更轻、更快、更易用”的服
golangTCPpush 编程

golangTCPpush

在当今互联网时代,即时通讯成为了人们生活中不可或缺的一部分。而实现即时通讯的关键技术之一就是TCP Push。作为一名专业的golang开发者,我们不仅需要掌握
nodegolang性能对比 编程

nodegolang性能对比

在当前的编程世界中,Node.js和Golang是两种备受瞩目的技术。它们都拥有出色的性能和能力,但在某些方面却存在差异。本文将对Node.js和Golang进
评论:0   参与:  20