如何实现双向链表

90 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 23 天,点击查看活动详情

作者: 千石
支持:点赞、收藏、评论
欢迎各位在评论区交流

前言

本文内容来自我平时学习的一些积累,如有错误,还请指正

在题目实战部分,我将代码实现和代码解释设置在了解题思路的下方,方便各位作为参考刷题

一些话

本文内容来自我平时学习的一些积累,如有错误,还请指正

正文

链表

链表是一种链式存取的数据结构,由一连串节点组成,每个节点包含任意的实例数据和一或两个用来指向上一个/或下一个节点的位置的链接。链表最明显的好处就是,常规数组需要预先定义大小,而链表可以动态地增加或减少元素。

链表的操作包括插入、删除、查找等。以下是Python实现单向链表数据结构及其基本方法的代码:

class Node(object):
    def __init__(self, data=None, next_node=None):
        self.data = data self.next_node = next_node
    def get_data(self):
        return self.data
    def get_next(self):
        return self.next_node
    def set_next(self, new_next):
        self.next_node = new_next
class LinkedList(object):
    def __init__(self, head=None):
        self.head = head
    def insert(self, data):
        new_node = Node(data)
        new_node.set_next(self.head)
        self.head = new_node 
    def size(self):
        current = self.head count = 0
        while current:
            count += 1
            current = current.get_next()
            return count
    def search(self, data):
        current = self.head found = False
        while current and not found:
            if current.get_data() == data:
                found = True
            else:
                current = current.get

双向链表

双向链表是一种链式存取的数据结构,每个节点包含任意的实例数据和两个用来指向上一个/或下一个节点的位置的链接。相比单向链表,双向链表可以在O(1)时间内完成删除操作。


class Node(object):
    def __init__(self, data, prev_node=None, next_node=None):
        self.prev = prev_node
        self.data = data
        self.next = next_node

class DoubleLinkedList(object):
    def __init__(self):
        self.head = None

    def insert(self, data):
        new_node = Node(data)
        if not self.head:
            self.head = new_node
        else:
            current = self.head
            while current.next:
                current = current.next
            current.next = new_node
            new_node.prev = current

    def delete(self, data):
        if not self.head:
            return None
        elif self.head.data == data:
            temp = self.head
            self.head = temp.next
            temp.next.prev = None
            return temp.data
        else:
            current = self.head.next
            while current and current.data != data:
                current = current.next
            if not current:
                return None
            else:
                temp_prev, temp_next= current.prev, current.next 
                temp_prev.next,temp_next.prev= temp

二者区别

单向链表只有一个指向下一结点的指针,双向链表除了有一个指向下一结点的指针外,还有一个指向前一结点的指针。单向链表只能单向读取,双向链表可以通过prev()快速找到前一结点。双向链表比单向链表查找效率更高,但增加删除节点复杂,需要多分配一个指针存储空间。

优缺点

优点:

  • 可以找到前驱和后继,可进可退

缺点:

  • 增加删除节点复杂,需要多分配一个指针存储空间