开启掘金成长之旅!这是我参与「掘金日新计划 · 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()快速找到前一结点。双向链表比单向链表查找效率更高,但增加删除节点复杂,需要多分配一个指针存储空间。
优缺点
优点:
- 可以找到前驱和后继,可进可退
缺点:
- 增加删除节点复杂,需要多分配一个指针存储空间